apache-spark - 架构不匹配 - 写入 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))
解决方案
使用 delta Lake 的底层格式 parquet 编写,并不能保证列的可空性。
也许你写了一个 parquet 肯定它不为 null,但是在 parquet 中写入时永远不会验证模式,并且任何人都可以使用相同的模式附加一些数据,但使用 null。因此,为了预防,spark 将始终将列设置为可为空的。
可以使用目录来防止这种行为,该目录将验证数据框是否遵循预期的模式。
推荐阅读
- go - 如何清除会话并在登录后仅访问关于页面?
- java - 离子科尔多瓦运行android不工作/失败
- android - 如何在颤动中将状态栏图标和文本颜色更改为黑色?
- swift - removeItem(at: ) 成功删除目标文件时抛出异常
- apache-spark - 火花作业中的大量随机写入时间
- typescript - 如何从 typeorm 实体中排除列,并且可以选择使用 Find 方法获取列
- java - 即使代码返回正确答案,运行时错误 (NZEC)
- angular - 输入'Observable<{ product: null; 错误:字符串;}>' 不可分配给类型 'Observable
' - javascript - 如何逃脱 React useEffect 无限循环?
- scrapy - 如何使用scrapy抓取asp webform链接