执行此操作时: select * from table_name limit 5
在Hive壳中,需要18秒才能完成;
但是当我用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,在实际执行之前需要30多分钟才能完成 head()
,因为table真的很大。
我想知道这是否是sparksql的适当行为?或者我做错了什么?
我用的是spark 1.6.3。
1条答案
按热度按时间new9mtju1#
我以前也遇到过同样的“问题”,一位同事告诉我
最佳的优化方法是spark将每个执行器限制为n,然后在最终结果集中限制为n
因此,您的作业被分发到多个执行器上,每个执行器都试图按原样执行查询,然后将数据返回到
head()
调用,限制数据集和稍后的时间,从而导致延迟。按照这个逻辑,我可以想象
limit 5
应该比一个纯粹的select *
或者table("table_name")
我个人还没有对这个过程进行足够的研究,以知道这是否是真的,但是当您考虑到执行者可能会死亡,或者有些人可能只查询未达到指定限制的数据子集时,这是有意义的,在这种情况下,这些结果需要与另一个结果集联接。