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

时间:2015-02-08 23:59:56

标签: hadoop hive apache-spark-sql

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。他们如此快速地改变了事情。

0 个答案:

没有答案