带有Hive数据源的SparkSQL会对head()进行全表扫描吗?

时间:2017-08-17 03:12:29

标签: apache-spark hive pyspark apache-spark-sql

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

1 个答案:

答案 0 :(得分:0)

我之前遇到过同样的“问题”而且一位同事告诉我这个

  

最佳优化是Spark可以将每个执行程序限制为N,然后在最终结果集上限制为N

因此,您的工作分配到众多执行程序中,每个执行程序都尝试按原样执行查询,然后将数据返回到head()调用,限制数据集以及稍后的时间,从而导致延迟。

按照这种逻辑,我认为limit 5应该比纯select *table("table_name")

更快地执行

我个人没有仔细研究过程,知道这是否属实,但是当你认为执行者可能会死亡时,或者某些人可能只查询未达到指定限制的数据子集时,这是有意义的,在这种情况下,这些结果需要与另一个结果集连接。