2017-08-17 40 views
0

在Hive shell中执行此操作时: select * from table_name limit 5需要18秒才能完成;带有Hive数据源的SparkSQL将为head()执行全表扫描?

但是,当我写这篇文章SparkSQL:

table = hiveCtx.sql("select * from table_name") 
print table.head() 

这是相同的,当我写

table = hiveCtx.sql("select * from table_name limit 5") 

table = hiveCtx.table("table_name") 

我看到它导致HiveTableScan,这在实际执行head()之前需要超过30分钟才能完成,因为表格是真的 大。

我想知道它是否是SparkSQL的恰当行为?或者我做错了什么?

我正在使用Spark 1.6.3。

回答

0

我碰到这个同样的“问题”之前和他的同事告诉我这

最好的优化是星星之火,可以每执行限制为N,则限制到N对最终结果集

所以,你的工作被分配到众多的执行人,每一个试图执行查询原样,然后将数据返回到head()通话,限制了数据集和以后的时间,从而造成延迟。

通过这种逻辑,我会想象limit 5应该不是执行更快纯select *table("table_name")

我个人还没有研究过程不够了解,如果这是真的,但它是有道理的,当你考虑执行者可能死亡,或者某些人可能只查询未达到指定限制的数据子集,在这种情况下,这些结果需要与另一个结果集连接。

+0

谢谢!那么SparkSQL和Hive之间相同SQL的执行逻辑是不同的? – DarkZero

+0

不一定。例如,您可以将Spark限制为1个执行程序,但这会破坏分布式处理的目的 –