logo

파이스파크 SQL

Apache Spark는 Apache Software Foundation의 가장 성공적인 소프트웨어이며 빠른 컴퓨팅을 위해 설계되었습니다. 여러 업계에서 Apache Spark를 사용하여 솔루션을 찾고 있습니다. PySpark SQL은 관계형 처리를 Spark의 함수형 프로그래밍 API와 통합하는 Spark의 모듈입니다. SQL 쿼리 언어를 사용하여 데이터를 추출할 수 있습니다. SQL 언어와 동일한 쿼리를 사용할 수 있습니다.

RDBMS에 대한 기본적인 이해가 있다면 PySpark SQL을 쉽게 사용할 수 있으며 기존 관계형 데이터 처리의 한계를 확장할 수 있습니다. Spark는 Hive 쿼리 언어도 지원하지만 Hive 데이터베이스에는 제한 사항이 있습니다. Spark SQL은 Hive 데이터베이스의 단점을 제거하기 위해 개발되었습니다. Hive의 다음 단점을 살펴보겠습니다.

하이브의 단점

  • 처리를 재개할 수 없습니다. 즉, 워크플로 도중에 실행이 실패하면 중단된 부분부터 재개할 수 없습니다.
  • 휴지통이 활성화된 경우 암호화된 데이터베이스를 계단식으로 삭제할 수 없습니다. 실행 오류가 발생합니다. 이러한 유형의 데이터베이스를 삭제하려면 사용자는 제거 옵션을 사용해야 합니다.
  • Ad-hoc 쿼리는 Hive에서 실행되는 MapReduce를 사용하여 실행되지만 중형 데이터베이스를 분석하면 성능이 지연됩니다.
  • Hive는 업데이트 또는 삭제 작업을 지원하지 않습니다.
  • 하위 쿼리 지원으로 제한됩니다.

이러한 단점이 Apache SQL을 개발하는 이유입니다.

PySpark SQL 간략한 소개

PySpark는 Spark의 함수형 프로그래밍과 통합 관계형 처리를 지원합니다. 다양한 데이터 소스에 대한 지원을 제공하여 코드 변환으로 SQL 쿼리를 엮을 수 있으므로 매우 강력한 도구가 됩니다.

PySpark SQL은 RDD와 관계형 테이블 간의 연결을 설정합니다. Spark 코드와 통합된 선언적 Dataframe API를 통해 관계형 처리와 절차적 처리 간의 훨씬 더 긴밀한 통합을 제공합니다.

이메일

SQL을 사용하면 더 많은 사용자가 쉽게 액세스할 수 있으며 현재 사용자에 대한 최적화가 향상됩니다. 또한 빅데이터의 광범위한 데이터 소스와 알고리즘을 지원합니다.

PySpark SQL의 기능

PySpark SQL의 기능은 다음과 같습니다.

1) 일관성 데이터 액세스

일관된 데이터 액세스를 제공한다는 것은 SQL이 다음과 같은 다양한 데이터 소스에 액세스하는 공유 방법을 지원한다는 것을 의미합니다. Hive, Avro, Parquet, JSON 및 JDBC. 기존의 모든 사용자를 Spark SQL에 수용하는 데 중요한 역할을 합니다.

2) 스파크와의 통합

PySpark SQL 쿼리는 Spark 프로그램과 통합됩니다. Spark 프로그램 내에서 쿼리를 사용할 수 있습니다.

가장 큰 장점 중 하나는 개발자가 상태 오류를 수동으로 관리하거나 애플리케이션을 일괄 작업과 동기화 상태로 유지할 필요가 없다는 것입니다.

3) 표준 연결

JDBC 또는 ODBC를 통한 연결을 제공하며 이 두 가지는 비즈니스 인텔리전스 도구 연결에 대한 업계 표준입니다.

4) 사용자 정의 함수

PySpark SQL에는 언어 결합 UDF(사용자 정의 함수)가 있습니다. UDF는 DataFrame 변환을 위해 Spark SQL의 DSL 어휘를 확장하는 새로운 열 기반 함수를 정의하는 데 사용됩니다.

문자를 문자열로 변환

5) 하이브 호환성

PySpark SQL은 현재 데이터에 대해 수정되지 않은 Hive 쿼리를 실행합니다. 현재 Hive 데이터와 완벽하게 호환됩니다.

PySpark SQL 모듈

Spark SQL 및 DataFrames의 몇 가지 중요한 클래스는 다음과 같습니다.

    pyspark.sql.Spark세션:의 주요 진입점을 나타냅니다. 데이터프레임 그리고 SQL 기능.pyspark.sql.DataFrame:이는 명명된 열로 그룹화된 데이터의 분산 컬렉션을 나타냅니다.pyspark.sql.열:이는 열 표현식을 나타냅니다. 데이터프레임. pyspark.sql.행:이는 데이터 행을 나타냅니다. 데이터프레임. pyspark.sql.그룹화된 데이터:반환된 집계 메서드 DataFrame.groupBy(). pyspark.sql.DataFrameNa함수:누락된 데이터(널 값)를 처리하는 방법을 나타냅니다.pyspark.sql.DataFrameStat함수:통계 기능에 대한 방법을 나타냅니다.pysark.sql.함수:사용할 수 있는 내장 함수 목록을 나타냅니다. 데이터프레임. pyspark.sql.types:사용 가능한 데이터 유형의 목록을 나타냅니다.pyspark.sql.창:Window 기능을 사용하는데 사용됩니다.

다음 PySpark SQL 예를 살펴보세요.

 import findspark findspark.init() import pyspark # only run after findspark.init() from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() df = spark.sql('''select 'spark' as hello ''') df.show() 

산출:

 +-----+ |hello| +-----+ |spark| +-----+ 

코드 설명:

위의 코드에서 우리는 파인즈파크 모듈과 호출 findpark.init() 건설자; 그런 다음 SparkSession 모듈을 가져와 스파크 세션을 만들었습니다.

Intellij 아이디어와 Eclipse

pyspark.sql에서 SparkSession 가져오기

Spark 세션을 사용하여 데이터 세트 및 DataFrame API를 생성할 수 있습니다. SparkSession은 DataFrame을 생성하고, DataFrame을 테이블로 등록하고, 테이블에 대해 SQL을 실행하고, 테이블을 캐시하고, Parquet 파일을 읽는 데에도 사용할 수 있습니다.

클래스 빌더

Spark Session의 빌더입니다.

getOrCreate()

기존의 것을 얻는 데 사용됩니다. 스파크 세션, 또는 기존 항목이 없는 경우 빌더에 설정된 옵션을 기반으로 새 항목을 만듭니다.

다른 방법은 거의 없습니다

PySpark SQL의 몇 가지 방법은 다음과 같습니다.

1. 앱이름(이름)

Spark 웹 UI에 표시될 애플리케이션의 이름을 설정하는 데 사용됩니다. 매개변수 이름 매개변수의 이름을 승인합니다.

2. config(키=없음, 값 = 없음, conf = 없음)

구성 옵션을 설정하는 데 사용됩니다. 이 방법을 사용하여 설정된 옵션은 두 가지 모두에 자동으로 전파됩니다. SparkConf 그리고 스파크 세션 의 구성입니다.

 from pyspark.conf import SparkConfSparkSession.builder.config(conf=SparkConf()) 

매개변수:

$home 리눅스가 뭐야?
    열쇠-구성 속성의 키 이름 문자열입니다.값-구성 속성의 값을 나타냅니다.conf -SparkConf의 인스턴스입니다.

3. 마스터(마스터)

로컬로 실행하려면 'local', 4개 코어로 로컬로 실행하려면 'local[4]' 등 연결할 스파크 마스터 URL을 설정합니다.

매개변수:

    주인:스파크 마스터의 URL입니다.

4. SparkSession.catalog

사용자가 기본 데이터베이스, 테이블, 함수 등을 생성, 삭제, 변경 또는 쿼리할 수 있는 인터페이스입니다.

5. SparkSession.conf

자바 문자열 하위 문자열

Spark용 런타임 구성 인터페이스입니다. 이는 사용자가 Spark SQL과 관련된 모든 Spark 및 Hadoop 구성을 가져오고 설정할 수 있는 인터페이스입니다.

클래스 pyspark.sql.DataFrame

이는 명명된 열로 그룹화된 데이터의 분산 모음입니다. DataFrame은 Spark SQL의 관계형 테이블과 유사하며 SQLContext의 다양한 기능을 사용하여 생성할 수 있습니다.

 student = sqlContext.read.csv('...') 

데이터프레임을 생성한 후에는 DataFrame의 사전 정의된 기능인 여러 DSL(도메인별 언어)을 사용하여 이를 조작할 수 있습니다. 다음 예를 고려하십시오.

 # To create DataFrame using SQLContext student = sqlContext.read.parquet('...') department = sqlContext.read.parquet('...') student.filter(marks > 55).join(department, student.student_Id == department.id)  .groupBy(student.name, 'gender').({'name': 'student_Id', 'mark': 'department'}) 

다음 예를 고려해 보겠습니다.

Spark SQL을 사용하여 쿼리

다음 코드에서는 먼저 DataFrame을 생성하고 SQL 쿼리를 실행하여 데이터를 검색합니다. 다음 코드를 고려해보세요.

 from pyspark.sql import * #Create DataFrame songdf = spark.read.csv(r'C:UsersDEVANSH SHARMA	op50.csv', inferSchema = True, header = True) #Perform SQL queries songdf.select('Genre').show() songdf.filter(songdf['Genre']=='pop').show() 

산출:

 +----------------+ | Genre| +----------------+ | canadian pop| | reggaeton flow| | dance pop| | pop| | dfw rap| | pop| | trap music| | pop| | country rap| | electropop| | reggaeton| | dance pop| | pop| | panamanian pop| |canadian hip hop| | dance pop| | latin| | dfw rap| |canadian hip hop| | escape room| +----------------+ only showing top 20 rows +---+--------------------+-------------+-----+----------------+------+------------+--------------+--------+--------+-------+--------------+------------+----------+ |_c0| Track.Name| Artist.Name|Genre|Beats.Per.Minute|Energy|Danceability|Loudness..dB..|Liveness|Valence.|Length.|Acousticness..|Speechiness.|Popularity| +---+--------------------+-------------+-----+----------------+------+------------+--------------+--------+--------+-------+--------------+------------+----------+ | 4|Beautiful People ...| Ed Sheeran| pop| 93| 65| 64| -8| 8| 55| 198| 12| 19| 86| | 6|I Don't Care (wit...| Ed Sheeran| pop| 102| 68| 80| -5| 9| 84| 220| 9| 4| 84| | 8| How Do You Sleep?| Sam Smith| pop| 111| 68| 48| -5| 8| 35| 202| 15| 9| 90| | 13| Someone You Loved|Lewis Capaldi| pop| 110| 41| 50| -6| 11| 45| 182| 75| 3| 88| | 38|Antisocial (with ...| Ed Sheeran| pop| 152| 82| 72| -5| 36| 91| 162| 13| 5| 87| | 44| Talk| Khalid| pop| 136| 40| 90| -9| 6| 35| 198| 5| 13| 84| | 50|Cross Me (feat. C...| Ed Sheeran| pop| 95| 79| 75| -6| 7| 61| 206| 21| 12| 82| +---+--------------------+-------------+-----+----------------+------+------------+--------------+--------+--------+-------+--------------+------------+----------+ 

groupBy() 함수 사용

groupBy() 함수는 유사한 카테고리 데이터를 수집합니다.

 songdf.groupBy('Genre').count().show() 

산출:

 +----------------+-----+ | Genre|count| +----------------+-----+ | boy band| 1| | electropop| 2| | pop| 7| | brostep| 2| | big room| 1| | pop house| 1| | australian pop| 1| | edm| 3| | r&b en espanol| 1| | dance pop| 8| | reggaeton| 2| | canadian pop| 2| | trap music| 1| | escape room| 1| | reggaeton flow| 2| | panamanian pop| 2| | atl hip hop| 1| | country rap| 2| |canadian hip hop| 3| | dfw rap| 2| +----------------+-----+ 

분포(numpartitions, *cols)

그만큼 분포() 분할 표현식인 새 DataFrame을 반환합니다. 이 함수는 두 개의 매개변수를 허용합니다. 숫자 파티션 그리고 *안부. 그만큼 숫자 파티션 매개변수는 대상 열 수를 지정합니다.

 song_spotify.repartition(10).rdd.getNumPartitions() data = song_spotify.union(song_spotify).repartition('Energy') data.show(5) 

산출:

 +---+--------------------+-----------+-------+----------------+------+------------+--------------+--------+--------+-------+--------------+------------+----------+ |_c0| Track.Name|Artist.Name| Genre|Beats.Per.Minute|Energy|Danceability|Loudness..dB..|Liveness|Valence.|Length.|Acousticness..|Speechiness.|Popularity| +---+--------------------+-----------+-------+----------------+------+------------+--------------+--------+--------+-------+--------------+------------+----------+ | 4|Beautiful People ...| Ed Sheeran| pop| 93| 65| 64| -8| 8| 55| 198| 12| 19| 86| | 5|Goodbyes (Feat. Y...|Post Malone|dfw rap| 150| 65| 58| -4| 11| 18| 175| 45| 7| 94| | 17| LA CANCI?N| J Balvin| latin| 176| 65| 75| -6| 11| 43| 243| 15| 32| 90| | 4|Beautiful People ...| Ed Sheeran| pop| 93| 65| 64| -8| 8| 55| 198| 12| 19| 86| | 5|Goodbyes (Feat. Y...|Post Malone|dfw rap| 150| 65| 58| -4| 11| 18| 175| 45| 7| 94| +---+--------------------+-----------+-------+----------------+------+------------+--------------+--------+--------+-------+--------------+------------+----------+ only showing top 5 rows