環境:
スパーク-1.2.0-ビン-hadoop2.4
spark-submit --class MyClass \
--master yarn-client \
--num-executors 20 --executor-memory 5g \
--driver-memory 4g --executor-cores 4 \
MyJar.jar
こんにちは、みんな、
最近、同じテーブルに参加するクエリを取得しました
SELECT columns_I_need
FROM
(
SELECT blablabla,column_for_join
FROM a_huge_table
WHERE common_expr AND expr_A
) a
LEFT JOIN
(
SELECT somethingelse,column_for_join
FROM a_huge_table
WHERE common_expr AND expr_B
) b
ON a.column_for_join = b.column_for_join
GROUP BY
columns_I_need
a_huge_table
非常に巨大なものでありcolumn_for_join
、インデックスを持っていません (私は DBA ではないので、私はそれを手伝うことができません - 彼らは拒否します)
このクエリは、Hive CLI (合計 200 未満のマッピングで 2 ステージ) で 3 ~ 5 分必要ですが、を使用するHiveContext.sql()
と、非常に悪い方法で崩壊します -> 4 ステージ、30 分/ステージ。
を使用するspark.sql.codegen
とステージ数が 2 に減りますが、各ステージの時間コストは減りません。このテーブルは 1 回しか使用されないため、HiveContext.CacheTable() はあまり役に立たないと思います。スパークで使用される方法は、ハイブでは多少異なると思います。
私はスパークソースを掘り下げようとしましたが、理解するのがHiveContext.sql(SqlText)
難しいSchemaRDD(HiveContext, LogicalPlan_Created_by_Parser_using_SqlText )
ことが分かりました: それから私は立ち往生しました。スパークがハイブからデータを取得する方法をまだ理解していません。SchemaRDDLike
sqlContext.executePlan
executedPlan.execute()
SparkPlan.execute()
SparkPlan.execute()
SELECT
では、spark SQL はどのように機能するのでしょうか? Spark SQL をよりよく理解するために読むべきドキュメントはありますか?
ちなみにHiveContext().sql():SchemaRDD
はなくなり、master ブランチのバージョンは になりHiveContext().sql():DataFrame
ました。彼らは物事をとても速く変えます。