我有一个Spark SQL流,例如:
dataFrame
.join(anotherDataFrame, columns)
.repartition(partitionColumn)
.save()
在join
步骤中,我希望spark.sql.adaptive.enabled
成为true
,因为这将加快连接速度。
在repartition
步骤中,我希望spark.sql.adaptive.enabled
为false
,因为如果它是真的,它可能会更改分区,并且保存的结果将被格式化为错误的分区。
如何在Spark SQL流的不同步骤中更改spark.sql.adaptive.enabled
的行为?
例如: 当只有15行时,我想根据一列将它们重新划分为3个分区。 但是,因为 spark.sql.adaptive.enabled 为true,所以重新分区步骤根本不起作用,它始终是1个分区
答案 0 :(得分:1)
如何在Spark SQL流的不同步骤中更改spark.sql.adaptive.enabled的行为?
您不能。该设置是按SparkSession
设置的,并且绑定到一个SparkSession
的所有查询都具有与此属性和任何其他属性相同的值。
请明确一点,没有“流程中的步骤” 的概念。有逻辑运算符可共同创建结构化查询。您可以将一个或多个逻辑运算符称为“步骤” 和结构化查询“流程” ,但是说实话,我以前从未听说过它们,并且可能会造成混乱
理论上,尽管可以使用提示为每个逻辑运算符(“步骤” )指定不同的“设置”。
实际上,Join
逻辑运算符在计划时“使用”广播提示来选择广播哈希联接(不是逻辑运算符本身,而是负责计划逻辑查询计划的执行计划策略)。
但是,这需要重新编写Spark SQL引擎(Catalyst Framework)。