火花物理计划中的步骤未分配给DAG步骤

问题描述 投票:1回答:1

我正在尝试在Spark SQL中调试返回错误数据的简单查询。

在这种情况下,查询是两个配置单元表之间的简单连接。该问题似乎与以下事实有关:在没有为物理计划中的某些步骤分配订单ID的情况下,火花所生成的物理计划(使用催化发动机)似乎已损坏,因此所有评估均在右侧进行。火花查询中的联接未完成

这里是示例查询

from pyspark_llap import HiveWarehouseSession
hive = HiveWarehouseSession.session(spark).build()

filter_1 = hive.executeQuery('select * from 03_score where scores = 5 or scores = 6')
filter_2 = hive.executeQuery('select * from 03_score where scores = 8')


joined_df = filter_1.alias('o').join(filter_2.alias('po'), filter_1.encntr_id == filter_2.encntr_id, how='inner')
joined_df.count() ### shows incorrect value ### 
joined_df.explain(True)

这是spark返回的实际计划的示例

== Physical Plan ==
 SortMergeJoin [encntr_id#0], [encntr_id#12], Inner
:- *(2) Sort [encntr_id#0 ASC NULLS FIRST], false, 0
:  +- Exchange hashpartitioning(encntr_id#0, 200)
:     +- *(1) Filter isnotnull(encntr_id#0)
:        +- *(1) DataSourceV2Scan [encntr_id#0, scores_datetime#1, scores#2], com.hortonworks.spark.sql.hive.llap.HiveWarehouseDataSourceReader@a6df563
+-  Sort [encntr_id#12 ASC NULLS FIRST], false, 0
   +- Exchange hashpartitioning(encntr_id#12, 200)
      +-  Filter isnotnull(encntr_id#12)
         +- DataSourceV2Scan [encntr_id#12, dateofbirth#13, postcode#14, event_desc#15, event_performed_dt_tm#16], com.hortonworks.spark.sql.hive.llap.HiveWarehouseDataSourceReader@60dd22d9

请注意,尚未为联接右侧的所有数据源扫描,过滤器交换和排序分配一个订单ID。

[谁能为我阐明这个问题。为什么为什么看起来正确的实物计划没有分配评估订单ID?

apache-spark hive cloudera hortonworks-data-platform catalyst-optimizer
1个回答
0
投票

[在内部解决了这个问题。

结果是,火花优化例程可能会受到配置设置的影响

spark.sql.codegen.Maxfields

这可能会影响spark如何优化从“胖”表中读取的内容。

在我的情况下,该设置设置得很低,这意味着从联接右侧(“胖”表)读取的DAG阶段已执行,而没有分配给整个阶段的代码源。

重要的是,在两种情况下读取配置单元数据都返回相同的结果,只是对物理计划应用了不同的优化

© www.soinside.com 2019 - 2024. All rights reserved.