Spark流DataFrame写入Delta Lake时如何指定表属性?
解决方案
完全可以在首次写入的过程中直接指定表属性,不需要提前手动定义schema建表,有两种常用实现方式:
方式1:写入路径时直接指定表属性
在流式写入的代码中,通过option传入需要设置的Delta表属性即可,所有Delta表属性都可以通过delta.前缀的参数配置,示例代码如下:
someStreamingDf.writeStream .format("delta") .outputMode("append") // 直接指定需要的表属性 .option("delta.autoOptimize.optimizeWrite", "true") // 其他需要的TBLPROPERTIES都可以按这个格式加多条option .option("checkpointLocation", "你的checkpoint存储路径") .start("targetPath")
写入完成后,执行建表SQL时不需要再额外指定TBLPROPERTIES,直接执行如下语句即可,不会再报属性不匹配的错误:
CREATE TABLE <TBL_NAME> USING DELTA LOCATION '<targetPath>'
方式2:直接写入表名,省略单独建表步骤
你可以直接用.table()方法代替路径参数写入,首次写入时Delta会自动根据DataFrame的schema创建表,同时同步你设置的所有表属性,连单独执行建表SQL的步骤都可以省略:
someStreamingDf.writeStream .format("delta") .outputMode("append") .option("delta.autoOptimize.optimizeWrite", "true") .option("checkpointLocation", "你的checkpoint存储路径") // 直接写目标表名,自动建表 .table("<TBL_NAME>")
报错原因说明
你之前的报错是因为首次写入路径时,Delta生成的默认元数据里没有你后续建表时指定的delta.autoOptimize.optimizeWrite属性,两边属性不一致触发了校验错误。首次写入时通过option传入属性,会直接写入Delta的事务日志元数据中,后续建表就不会出现属性冲突问题。
内容的提问来源于stack exchange,提问作者John Black
相关产品推荐
相关产品推荐

