数据湖探索 DLI-Spark 2.4.x与Spark 3.3.x版本在通用队列的差异对比:Spark将不可为null的模式转换为可空

时间:2025-02-27 14:33:51

Spark将不可为null的模式转换为可空

  • 说明:

    在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。

    但是在Spark 3.3.x版本中,Spark尊重用户指定的schema中的nullability,即如果字段被定义为不可为空,Spark会保持该配置要求,不会自动转换为可空的字段。

    • Spark2.4.x:在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。
    • Spark3.3.x:Spark不会自动转换为可空的字段。

      如果希望在Spark 3.3.x版本中恢复到Spark 2.4.x版本的执行方式,您可以通过将 spark.sql.legacy.respectNullabilityInTextDatasetConversion设置为true来实现。

  • 升级引擎版本后是否对作业有影响:

    有影响。

  • 示例代码

    执行sql:

    spark.read.schema(StructType(
    StructField("f1", LongType, nullable = false) ::
    StructField("f2", LongType, nullable = false) :: Nil)
    ).option("mode", "DROPMALFORMED").json(Seq("""{"f1": 1}""").toDS).show(false);
    • Spark 2.4.5
      |f1 |f2 |
      +---+---+
      |1  |0  |
    • Spark 3.3.1
      |f1 |f2  |
      +---+----+
      |1  |null|
support.huaweicloud.com/bulletin-dli/dli_bulletin_0016.html