首页 > 解决方案 > 架构不匹配 - 写入 Delta 的 Spark DataFrame

问题描述

将数据帧写入 delta 格式时,生成的 delta 似乎不遵循所写入数据帧的架构。具体来说,无论源数据帧架构如何,字段的“可为空”属性在生成的增量中似乎始终为“真”。这是预期的还是我在这里犯了错误?有没有办法让写入的 delta 模式与源 df 完全匹配?

scala> df.schema
res2: org.apache.spark.sql.types.StructType = StructType(StructField(device_id,StringType,false), StructField(val1,StringType,true), StructField(val2,StringType,false), StructField(dt,StringType,true))

scala> df.write.format("delta").save("D:/temp/d1")

scala> spark.read.format("delta").load("D:/temp/d1").schema
res5: org.apache.spark.sql.types.StructType = StructType(StructField(device_id,StringType,true), StructField(val1,StringType,true), StructField(val2,StringType,true), StructField(dt,StringType,true))

标签: apache-sparkapache-spark-sqldelta-lake

解决方案


使用 delta Lake 的底层格式 parquet 编写,并不能保证列的可空性。

也许你写了一个 parquet 肯定它不为 null,但是在 parquet 中写入时永远不会验证模式,并且任何人都可以使用相同的模式附加一些数据,但使用 null。因此,为了预防,spark 将始终将列设置为可为空的。

可以使用目录来防止这种行为,该目录将验证数据框是否遵循预期的模式。


推荐阅读