环境:
spark-1.2.0-bin-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 中需要 3~5 分钟(2 个阶段,总共 <200 个映射),但是在使用时HiveContext.sql()
,事情以非常糟糕的方式崩溃 -> 4 个阶段,30 分钟/阶段。
使用spark.sql.codegen
将阶段数减少到2,但每个阶段的时间成本不会减少。由于这个表只会被使用一次,我认为 HiveContext.CacheTable() 不会有太大帮助。我猜火花中使用的方法与蜂巢有些不同。
我尝试挖掘火花源,发现很难理解:HiveContext.sql(SqlText)
return SchemaRDD(HiveContext, LogicalPlan_Created_by_Parser_using_SqlText )
,我看到 LogicalPlan 用于 trait SchemaRDDLike
=> sqlContext.executePlan
=> executedPlan.execute()
=>SparkPlan.execute()
但我找不到SparkPlan.execute()
任何覆盖版本称为SELECT
. 然后我就卡住了。我仍然不明白 spark 如何从 hive 中获取数据。
那么 Spark SQL 是如何工作的呢?我想知道是否有任何文档可以阅读以更好地理解 Spark SQL?
顺便说一句,HiveContext().sql():SchemaRDD
没有了,master 分支的版本现在是HiveContext().sql():DataFrame
. 他们改变事物的速度如此之快。