私は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に完全なコードを書く価値はありますか?
ありがとうございました。
質問:これら2つのアプローチの違いは何ですか? Dataframe APIを使用するとパフォーマンスが向上しますか?
回答:
ホートン作品によって行われた比較研究があります。 ソース ...
要点は状況/シナリオに基づいており、それぞれが正しい。これを決定するための厳格なルールはありません。 plsは下を通過します。
Sparkは、Resilient Distributed Datasets、またはRDDの概念に基づいて動作します:
DataFrames APIは、データを名前付き列に編成するデータ抽象化フレームワークです。
SparkSQLは、構造化データ処理用のSparkモジュールです。SparkSQLと対話するには、次の方法を使用できます。
DataFramesとSparkSQLはほぼ同じパフォーマンスを発揮しましたが、SparkSQLの集計とソートを含む分析にはわずかな利点がありました
構文的に言えば、DataFrameとSparkSQLはRDDを使用するよりもはるかに直感的です
各テストで3つのうち最高の結果を取りました
時間は一貫しており、テスト間の変動はあまりありませんでした
ジョブは個別に実行され、他のジョブは実行されませんでした
900万のユニークなオーダーIDのGROUPからの1つのオーダーIDに対するランダムなルックアップ。すべての異なる製品とその合計COUNTSおよびSORT DESCENDINGから製品名
Spark= SQL文字列クエリでは、実行時まで構文エラーはわかりません(コストがかかる可能性があります)が、DataFramesではコンパイル時に構文エラーをキャッチできます。
クエリが長い場合、クエリの効率的な記述と実行はできません。一方、DataFrameとColumn APIを使用すると、開発者はコンパクトなコードを記述でき、ETLアプリケーションに最適です。
また、すべての操作(たとえば、より大きい、より小さい、選択、場所など).... "DataFrame"を使用して実行すると、 "Abstract Syntax Tree(AST) "。その後、さらに最適化するために「Catalyst」に渡されます。 (ソース:Spark SQL Whitepaper、Section#3.)