sparksql和hive数据源将对head()执行完整的表扫描?

guykilcj  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(336)

执行此操作时: 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。

new9mtju

new9mtju1#

我以前也遇到过同样的“问题”,一位同事告诉我
最佳的优化方法是spark将每个执行器限制为n,然后在最终结果集中限制为n
因此,您的作业被分发到多个执行器上,每个执行器都试图按原样执行查询,然后将数据返回到 head() 调用,限制数据集和稍后的时间,从而导致延迟。
按照这个逻辑,我可以想象 limit 5 应该比一个纯粹的 select * 或者 table("table_name") 我个人还没有对这个过程进行足够的研究,以知道这是否是真的,但是当您考虑到执行者可能会死亡,或者有些人可能只查询未达到指定限制的数据子集时,这是有意义的,在这种情况下,这些结果需要与另一个结果集联接。

相关问题