繁体   English   中英

如何 append 2 SQL 列数不同的表?

[英]How to append 2 SQL tables with different number of columns?

我在服务器中存储的 SQL 数据库中有一个表 (TableA),可通过 Microsoft SQL Server Management Studio 访问。

然后我有一个 Databricks 笔记本,它创建一个表 (TableB),然后将其附加到存储在服务器中的表 (表 A)。

到 append TableB 到 TableA 我使用 spark:

df_tableB.write.format("jdbc") \
    .mode('append') \
    .option("url", db_jdbc_url) \
    .option("driver", driver) \
    .option("dbtable", table_name) \
    .option("user", db_user) \
    .option("password", db_password) \
    .save()

如果 TableA 和 TableB 的架构相同,这将非常有效。 但是我发现现在我的 TableB 可能有一个稍微不同的模式,特别是可能有额外的列。

因此,我想知道 append 表是否有一种模式,以便所有共有的列都按原样附加,并且新列也被附加,可能显示“无”。 你能提出一个聪明而优雅的方法来实现我的目标吗?

只读取TableA和 select 的架构,仅读取TableB中的那些列:

df_tableA = spark.read.format("jdbc").option(...)...load(...)
columns = [F.col(column_name) if column_name in df_tableB.schema.names else F.lit(None).alias(column_name) for column_name in df_tableA.schema.names]
df_tableB.select(columns).write.format("jdbc") \
    .mode('append') \
    .option("url", db_jdbc_url) \
    .option("driver", driver) \
    .option("dbtable", table_name) \
    .option("user", db_user) \
    .option("password", db_password) \
    .save()

这样只会选择TableA中存在的列,并且顺序是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM