Databricks/pyspark -插入到带有标识的表中

mzillmmw  于 9个月前  发布在  Spark
关注(0)|答案(1)|浏览(140)

我在使用Pyspark将数据从数据框插入到具有标识列的增量表时遇到了问题。如果我不将列包含在数据框中,它就会失败,并出现模式不匹配错误,或者我无法插入到“始终作为标识生成”列中。通常,在SQL中,我在插入数据时不会在列列表中提及列。如何在Pyspark中处理它?
示例代码如下所示:

  • SQL:
create table sample.table (
id bigint generated always as identity (start with 1 increment by 1),
name string,
address string
)
using delta

字符串

  • Pyspark:
df = df.select("name", "address")
df.write.format("delta").mode("overwrite").saveAsTable("sample.table")


由于模式不匹配,这将失败。如果像 df = df.select(lit(None).alias(“id”),“name”,“address”) 这样做,它也会失败。
我得到的错误:

  • 如果我使用 lit(None).alias(“id”)

不支持为GENERATED ALWAYS AS IDENTITY列pk_part_current提供值。

  • 如果我排除标识列:
    **AnalysisException:**写入Delta表时检测到架构不匹配(表ID:b83 f1234-a178- 486 f-be 53 - 2478 cb 4a 1234)。要启用使用DataFrameWriter或DataStreamWriter的架构迁移,请设置:'.option(“mergeSchema”,“true”'。对于其他操作,将会话配置spark.databricks.delta.schema.autoMerge.enabled设置为“true”。有关详细信息,请参阅特定于该操作的文档。

表架构:

-- id:long(nullable = false)
-- name:string(nullable = true)
-- address:string(nullable = true)
数据架构:

-- name:string(nullable = true)
-- address string(nullable = true)
若要覆盖架构或更改分区,请设置:'.option(“overwriteSchema”,“true”0'。
请注意,在使用“replaceWhere”时,无法覆盖架构。
我会很感激你的帮助。

avwztpqn

avwztpqn1#

我已经使用了 * 选项(“mergeSchema”,“true”)*,它有助于绕过这个问题。应该谨慎使用它,因为它可能会因为一个简单的错字而弄乱目标表模式。将它与缺乏删除列功能(目前在Public Preview中可用)结合起来,它可能会给你带来麻烦。

相关问题