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