Iceberg 架构不合并缺失的列

Iceberg schema not merging missing columns

提问人:user1668814 提问时间:11/17/2023 更新时间:11/19/2023 访问量:33

问:

我正在 AWS Glue 作业中使用以下代码创建 Iceberg 表:

df.writeTo(f'glue_catalog.{DATABASE_NAME}.{TABLE_NAME}') \
    .using('iceberg') \
    .tableProperty("location", TABLE_LOCATION) \
    .tableProperty("write.spark.accept-any-schema", "true") \
    .tableProperty("format-version", "2") \
    .createOrReplace()

表格已创建,我可以在 Glue/LF 中看到它,并且可以在 Athena 中查询它。

我有另一项工作,正在尝试使用以下内容更新插入数据:

df_upsert.createOrReplaceTempView("upsert_items")
upsert_query = f"""
MERGE INTO glue_catalog.{DATABASE_NAME}.{TABLE_NAME} target
USING (SELECT * FROM upsert_items) updates
ON {join_condidtion}
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
"""
spark.sql(upsert_query)

GlueJob 失败并说:

AnalysisException: cannot resolve my_column in MERGE command given columns [updates.col1, updates.col2, ...

当可能缺少列或可能添加列时,如何合并新数据。我以为 Iceberg 会通过为缺失/新列填写 NULL 来处理这个问题,因为我设置了“write.spark.accept-any-schema” = true。谢谢。

运行 Spark 版本 3.3.0-amzn-1
AWS GlueJob v4
Iceberg v1.0.0

pyspark aws-glue 冰山 apache-iceberg

评论

0赞 user1668814 11/18/2023
看起来尚不支持此功能。这是我找到的公开票:github.com/apache/iceberg/issues/5556

答:

0赞 Yousry 11/19/2023 #1

根据文档

编写器必须启用 mergeSchema 选项。

data.writeTo("prod.db.sample").option("mergeSchema","true").append()

目前,使用 .spark.sql("MERGE ...")

有一个未解决的“功能请求”问题来处理这个问题。

一种“非最佳”解决方案是检测是否在源中找到列,而在目标中尚未找到列,然后在 MERGE 语句之前执行。🤷‍♂️🤷‍♂️🤷‍♂️ALTER TABLE target ADD COLUMN