执行此操作时:
在Hive shell中select * from table_name limit 5
,需要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,在实际执行head()
之前需要30多分钟才能完成,因为该表非常大。
我想知道它是否是SparkSQL的合适行为?或者我做错了什么?
我正在使用Spark 1.6.3。
答案 0 :(得分:0)
我之前遇到过同样的“问题”而且一位同事告诉我这个
最佳优化是Spark可以将每个执行程序限制为N,然后在最终结果集上限制为N
因此,您的工作分配到众多执行程序中,每个执行程序都尝试按原样执行查询,然后将数据返回到head()
调用,限制数据集以及稍后的时间,从而导致延迟。
按照这种逻辑,我认为limit 5
应该比纯select *
或table("table_name")
我个人没有仔细研究过程,知道这是否属实,但是当你认为执行者可能会死亡时,或者某些人可能只查询未达到指定限制的数据子集时,这是有意义的,在这种情况下,这些结果需要与另一个结果集连接。