logo

PySpark 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 の次の欠点を見てみましょう。

ハイブの欠点

  • 処理を再開することはできません。つまり、ワークフローの途中で実行が失敗した場合、停止した場所から再開することはできません。
  • ゴミ箱が有効になっている場合、暗号化されたデータベースをカスケードで削除することはできません。実行エラーの原因となります。このようなタイプのデータベースを削除するには、ユーザーはパージ オプションを使用する必要があります。
  • アドホック クエリは、Hive によって起動される MapReduce を使用して実行されますが、中規模のデータベースを分析する場合、パフォーマンスが遅延します。
  • Hive は更新または削除の操作をサポートしていません。
  • サブクエリのサポートに限定されます。

これらの欠点が、Apache SQL を開発する理由です。

PySpark SQL の概要

PySpark は、Spark の関数型プログラミングによる統合リレーショナル処理をサポートします。さまざまなデータ ソースのサポートを提供し、コード変換を使用して SQL クエリを作成できるため、非常に強力なツールになります。

PySpark SQL は、RDD とリレーショナル テーブル間の接続を確立します。 Spark コードと統合された宣言型 Dataframe API を通じて、リレーショナル処理と手続き型処理がより緊密に統合されます。

SQL を使用すると、より多くのユーザーが簡単にアクセスできるようになり、現在のユーザーの最適化が向上します。また、ビッグデータの幅広いデータ ソースとアルゴリズムもサポートしています。

Javaは現在の日付を取得します

PySpark SQLの機能

PySpark SQL の機能は次のとおりです。

1) 一貫性のあるデータアクセス

一貫したデータ アクセスを提供するということは、SQL が次のようなさまざまなデータ ソースにアクセスするための共有方法をサポートしていることを意味します。 Hive、Avro、Parquet、JSON、および JDBC。 これは、既存のすべてのユーザーを Spark SQL に適応させる上で重要な役割を果たします。

2) Sparkとの統合

PySpark SQL クエリは Spark プログラムと統合されています。 Spark プログラム内でクエリを使用できます。

その最大の利点の 1 つは、開発者が状態エラーを手動で管理したり、アプリケーションをバッチ ジョブと同期させたりする必要がないことです。

3) 標準接続性

JDBC または ODBC を介した接続が提供され、これら 2 つはビジネス インテリジェンス ツールの接続に関する業界標準です。

4) ユーザー定義関数

PySpark SQL には、ユーザー定義関数 (UDF) を組み合わせた言語があります。 UDF は、DataFrame を変換するための Spark SQL の DSL の語彙を拡張する新しい列ベースの関数を定義するために使用されます。

5) ハイブの互換性

PySpark SQL は、現在のデータに対して未変更の Hive クエリを実行します。現在の Hive データとの完全な互換性が可能です。

PySpark SQL モジュール

Spark SQL および DataFrame のいくつかの重要なクラスは次のとおりです。

    pyspark.sql.SparkSession:これは、次の主要なエントリ ポイントを表します。 データフレーム そして SQL 機能。pyspark.sql.DataFrame:これは、名前付き列にグループ化されたデータの分散コレクションを表します。pyspark.sql.列:の列式を表します。 データフレーム。 pyspark.sql.行:これは、データの行を表します。 データフレーム。 pyspark.sql.GroupedData:によって返される集計メソッド DataFrame.groupBy()。 pyspark.sql.DataFrameNaFunctions:欠損データ (NULL 値) を処理するメソッドを表します。pyspark.sql.DataFrameStatFunctions:これは統計機能のメソッドを表します。pysark.sql.functions:これは、利用可能な組み込み関数のリストを表します。 データフレーム。 pyspark.sql.types:これは、使用可能なデータ型のリストを表します。pyspark.sql.ウィンドウ:ウィンドウ関数を操作するために使用されます。

次の 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| +-----+ 

コードの説明:

上記のコードでは、 スパークを見つける モジュールと呼び出された findspark.init() コンストラクタ;次に、SparkSession モジュールをインポートして Spark セッションを作成しました。

pyspark.sql から SparkSession をインポート

Spark セッションを使用して、Dataset および DataFrame API を作成できます。 SparkSession は、DataFrame の作成、DataFrame のテーブルとしての登録、テーブルに対する SQL の実行、テーブルのキャッシュ、寄木細工ファイルの読み取りにも使用できます。

クラスビルダー

Spark Sessionのビルダーです。

getOrCreate()

既存のものを取得するために使用されます スパークセッション、 既存のものが存在しない場合は、ビルダーで設定されたオプションに基づいて新しいものを作成します。

他のいくつかの方法

PySpark SQL のいくつかのメソッドは次のとおりです。

1.アプリ名(名前)

これは、Spark Web UI に表示されるアプリケーションの名前を設定するために使用されます。パラメータ 名前 パラメータの名前を受け入れます。

2. config(key=なし、value = なし、conf = なし)

構成オプションを設定するために使用されます。このメソッドを使用して設定されたオプションは、両方に自動的に反映されます。 SparkConf そして スパークセッション の構成です。

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

パラメーター:

    鍵-構成プロパティのキー名の文字列。価値-これは構成プロパティの値を表します。設定 -SparkConf のインスタンス。

3.マスター(マスター)

C# 辞書

ローカルで実行する場合は「local」、4 コアでローカルで実行する場合は「local[4]」など、接続先の Spark マスター URL を設定します。

パラメーター:

    マスター:スパークマスターのURL。

4.SparkSession.カタログ

gimpのフォントのリスト

これは、ユーザーが基礎となるデータベース、テーブル、関数などを作成、削除、変更、またはクエリできるインターフェイスです。

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| +----------------+-----+ 

distribution(パーティション数, *列)

分布() パーティショニング式である新しい DataFrame を返します。この関数は 2 つのパラメータを受け取ります パーティション数 そして *列。パーティション数 パラメータでターゲットの列数を指定します。

 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