我在不同字段的同一个表中有多个 Spark Streaming 写入。 Iceberg 文档说了以下内容:Iceberg 支持使用乐观并发的多个并发写入。
但是尝试合并时出现错误消息:
原因:org.apache.iceberg.exceptions.ValidationException:发现可能包含与 true 匹配的记录的冲突文件
Spark 合并:
spark.sql(
f"""
MERGE INTO datahub.replicacao.pefin_table tgt
USING (select nu_documento, co_cadus, aud_enttyp, nu_particao from pefin_pf) src
ON tgt.nu_documento = src.nu_documento and src.nu_particao in ('1', '2', '4')
WHEN MATCHED AND src.aud_enttyp = 'D' THEN DELETE
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
""")
Spark 会话配置:
val spark = SparkSession.builder()
.master("local[*]")
.config("spark.sql.catalog.datahub", "org.apache.iceberg.spark.SparkSessionCatalog")
.config("spark.sql.catalog.datahub.type", "hadoop")
.config("spark.sql.catalog.datahub", "org.apache.iceberg.spark.SparkCatalog")
.config("spark.sql.catalog.datahub.warehouse", "file:///C:/dev/warehouse")
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.getOrCreate()
Iceberg 不支持同时更新同一个表、同一个分区、同一个数据文件。 这是冰山的限制。 因此,您不能使用合并到同一个表中来进行多个流处理。 虽然它并不优雅,但您可以在应用程序中使用重试逻辑来完成这项工作。