web-dev-qa-db-ja.com

Spark SQLでのSQLの記述とDataframe APIの使用

私はSpark SQL world。の新しいミツバチです。現在、ステージでのデータの取り込み、HDFSでのRawおよびApplicationレイヤーの取り込み、CDC(変更データの取り込み)を行うアプリケーションの取り込みコードを移行しています。現在、Hiveクエリで記述されており、Oozieを介して実行されます。これはSpark application(current version 1.6)に移行する必要があります。コードの他のセクションは後で移行します。

Spark-SQLでは、Hiveのテーブルから直接データフレームを作成し、クエリをそのまま実行することができます(sqlContext.sql("my Hive hql")など)。もう1つの方法は、データフレームAPIを使用し、その方法でhqlを書き換えることです。

これら2つのアプローチの違いは何ですか?

Dataframe APIを使用するとパフォーマンスが向上しますか?

一部の人は、「SQL」クエリを直接使用する場合、sparkコアエンジンが通過する必要がある追加のSQLレイヤーがあり、パフォーマンスにある程度影響する可能性がありますが、マテリアルは見つかりませんでしたDatafrmae APIを使用するとコードがはるかにコンパクトになることはわかっていますが、hqlクエリがあれば便利なので、Dataframe APIに完全なコードを書く価値はありますか?

ありがとうございました。

18
PPPP

質問:これら2つのアプローチの違いは何ですか? Dataframe APIを使用するとパフォーマンスが向上しますか?


回答:

ホートン作品によって行われた比較研究があります。 ソース ...

要点は状況/シナリオに基づいており、それぞれが正しい。これを決定するための厳格なルールはありません。 plsは下を通過します。

RDD、DataFrame、およびSparkSQL(2つだけでなく、実際の3つのアプローチ):

Sparkは、Resilient Distributed Datasets、またはRDDの概念に基づいて動作します:

  • 復元力-メモリ内のデータが失われた場合、再作成可能
  • 分散-クラスター内の多くのデータノードに分割されたメモリ内のオブジェクトの不変の分散コレクション
  • データセット-初期データは、ファイル、プログラムで作成、メモリ内のデータ、または別のRDDから取得できます

DataFrames APIは、データを名前付き列に編成するデータ抽象化フレームワークです。

  • データのスキーマを作成する
  • リレーショナルデータベースのテーブルと概念的に同等
  • 構造化データファイル、Hiveのテーブル、外部データベース、または既存のRDDを含む多くのソースから構築できます
  • データのリレーショナルビューを提供し、データ操作や集計などの簡単なSQLを提供します
  • 内部では、RDDの行です。

SparkSQLは、構造化データ処理用のSparkモジュールです。SparkSQLと対話するには、次の方法を使用できます。

  • SQL
  • DataFrames API
  • データセットAPI

試験結果:

  • 特定の種類のデータ処理でRDDのDataFrameとSparkSQLを上回る
  • DataFramesとSparkSQLはほぼ同じパフォーマンスを発揮しましたが、SparkSQLの集計とソートを含む分析にはわずかな利点がありました

  • 構文的に言えば、DataFrameとSparkSQLはRDDを使用するよりもはるかに直感的です

  • 各テストで3つのうち最高の結果を取りました

  • 時間は一貫しており、テスト間の変動はあまりありませんでした

  • ジョブは個別に実行され、他のジョブは実行されませんでした

900万のユニークなオーダーIDのGROUPからの1つのオーダーIDに対するランダムなルックアップ。すべての異なる製品とその合計COUNTSおよびSORT DESCENDINGから製品名

enter image description here

12
Ram Ghadiyaram

Spark= SQL文字列クエリでは、実行時まで構文エラーはわかりません(コストがかかる可能性があります)が、DataFramesではコンパイル時に構文エラーをキャッチできます。

10
Arun Sharma

クエリが長い場合、クエリの効率的な記述と実行はできません。一方、DataFrameとColumn APIを使用すると、開発者はコンパクトなコードを記述でき、ETLアプリケーションに最適です。

また、すべての操作(たとえば、より大きい、より小さい、選択、場所など).... "DataFrame"を使用して実行すると、 "Abstract Syntax Tree(AST) "。その後、さらに最適化するために「Catalyst」に渡されます。 (ソース:Spark SQL Whitepaper、Section#3.

0
G.S.Tomar