Apache spark 带有配置单元数据源的SparkSQL将对head()执行完整表扫描?
执行此操作时:Apache spark 带有配置单元数据源的SparkSQL将对head()执行完整表扫描?,apache-spark,hive,pyspark,apache-spark-sql,Apache Spark,Hive,Pyspark,Apache Spark Sql,执行此操作时: 在Hive shell中从表_namelimit 5中选择*,需要18秒才能完成 但当我在SparkSQL中编写这篇文章时: table = hiveCtx.sql("select * from table_name") print table.head() 我写作的时候也是这样 table = hiveCtx.sql("select * from table_name limit 5") 或 我看到它会导致HiveTableScan,在实际执行head()之前需要30多分钟
在Hive shell中从表_namelimit 5中选择*,需要18秒才能完成
但当我在SparkSQL中编写这篇文章时:
table = hiveCtx.sql("select * from table_name")
print table.head()
我写作的时候也是这样
table = hiveCtx.sql("select * from table_name limit 5")
或
我看到它会导致HiveTableScan,在实际执行head()
之前需要30多分钟才能完成,因为表非常大
我想知道这是否是SparkSQL的适当行为?还是我做错了什么
我正在使用Spark 1.6.3。我以前遇到过同样的“问题”,一位同事告诉我这一点
最佳优化是Spark可以将每个执行器限制为N,然后在最终结果集中限制为N
因此,作业被分配到多个执行器上,每个执行器都试图按原样执行查询,然后数据返回到head()
调用,从而限制了数据集和以后的时间,从而导致延迟
根据这种逻辑,我可以想象limit 5
应该比纯select*
或table(“table_name”)
执行得更快
我个人还没有对这个过程进行足够的研究,以知道这是否是真的,但当您考虑到执行者可能会死亡,或者一些人可能只查询未达到指定限制的数据子集时,这是有意义的,在这种情况下,这些结果需要与另一个结果集合并 我以前也遇到过同样的“问题”,一位同事告诉我这一点
最佳优化是Spark可以将每个执行器限制为N,然后在最终结果集中限制为N
因此,作业被分配到多个执行器上,每个执行器都试图按原样执行查询,然后数据返回到head()
调用,从而限制了数据集和以后的时间,从而导致延迟
根据这种逻辑,我可以想象limit 5
应该比纯select*
或table(“table_name”)
执行得更快
我个人还没有对这个过程进行足够的研究,以知道这是否是真的,但当您考虑到执行者可能会死亡,或者一些人可能只查询未达到指定限制的数据子集时,这是有意义的,在这种情况下,这些结果需要与另一个结果集合并 谢谢大家!!因此,SparkSQL和Hive之间相同SQL的执行逻辑不同?不一定。例如,您可以将Spark限制为1个执行器,但这违背了分布式处理的目的谢谢!因此,SparkSQL和Hive之间相同SQL的执行逻辑不同?不一定。例如,您可以将Spark限制为1个执行器,但这会破坏分布式处理的目的
table = hiveCtx.table("table_name")