如何为结构化查询的不同代码部分指定分区数?

时间:2019-01-28 09:35:00

标签: apache-spark apache-spark-sql

我有一个Spark SQL流,例如:

dataFrame
  .join(anotherDataFrame, columns)
  .repartition(partitionColumn)
  .save()

join步骤中,我希望spark.sql.adaptive.enabled成为true,因为这将加快连接速度。

repartition步骤中,我希望spark.sql.adaptive.enabledfalse,因为如果它是真的,它可能会更改分区,并且保存的结果将被格式化为错误的分区。

如何在Spark SQL流的不同步骤中更改spark.sql.adaptive.enabled的行为?

例如: 当只有15行时,我想根据一列将它们重新划分为3个分区。 但是,因为 spark.sql.adaptive.enabled 为true,所以重新分区步骤根本不起作用,它始终是1个分区

1 个答案:

答案 0 :(得分:1)

  

如何在Spark SQL流的不同步骤中更改spark.sql.adaptive.enabled的行为?

您不能。该设置是按SparkSession设置的,并且绑定到一个SparkSession的所有查询都具有与此属性和任何其他属性相同的值。

请明确一点,没有“流程中的步骤” 的概念。有逻辑运算符可共同创建结构化查询。您可以将一个或多个逻辑运算符称为“步骤” 和结构化查询“流程” ,但是说实话,我以前从未听说过它们,并且可能会造成混乱


理论上,尽管可以使用提示为每个逻辑运算符(“步骤” )指定不同的“设置”。

实际上,Join逻辑运算符在计划时“使用”广播提示来选择广播哈希联接(不是逻辑运算符本身,而是负责计划逻辑查询计划的执行计划策略)。

但是,这需要重新编写Spark SQL引擎(Catalyst Framework)。