Hadoop 执行select查询时,HiveContext.sql()将如何工作?

Hadoop 执行select查询时,HiveContext.sql()将如何工作?,hadoop,hive,apache-spark-sql,Hadoop,Hive,Apache Spark Sql,环境: 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 ( SE

环境:

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
一个庞大的表
是一个非常庞大的表,而且
列_for _join
没有索引(我不是DBA,我帮不了忙-他们拒绝)

此查询在Hive CLI中需要3~5分钟(2个阶段,共4个阶段,每个阶段30分钟)

使用
spark.sql.codegen
将阶段数减少到2个,但每个阶段的时间开销不会减少。由于此表只使用一次,我假设HiveContext.CacheTable()不会有多大帮助。我想spark中使用的方法与hive有所不同

我试图挖掘spark源代码,发现它很难理解:
HiveContext.sql(SqlText)
return
SchemaRDD(HiveContext,LogicalPlan由解析器使用SqlText创建)
,我看到LogicalPlan在trait
SchemaRDDLike
sqlContext.executePlan
executePlan.execute()
=>
SparkPlan.execute()
但我找不到
SparkPlan.execute()
有任何名为
SELECT
的覆盖版本。然后我被卡住了。我仍然不明白spark是如何从蜂巢抓取数据的

那么spark SQL是如何工作的呢?我想知道是否有任何文档可以阅读以更好地理解spark SQL

顺便说一句,
HiveContext().sql():SchemaRDD
已经不存在了,master branch现在的版本是
HiveContext().sql():DataFrame
。它们改变的太快了