Delta Lake中如何用MERGE INTO实现类REPLACE INTO的无来源表upsert
Delta Lake 本身没有和 SQLite REPLACE INTO 完全对等的单句简写语法,但可以通过 临时构造单行/多行虚拟数据源 的方式实现不用额外创建实体源表的UPSERT效果,完全匹配你要的手动传值需求。
单条数据手动UPSERT示例
比如要对users表插入/更新userId=123、address='北京市朝阳区'的记录,写法如下:
MERGE INTO users USING (SELECT 123 AS userId, '北京市朝阳区' AS address) AS updates ON users.userId = updates.userId WHEN MATCHED THEN UPDATE SET address = updates.address WHEN NOT MATCHED THEN INSERT (userId, address) VALUES (updates.userId, updates.address)
这里的USING子句没有引用任何实体表,而是直接用SELECT语句手动构造了包含目标值的虚拟数据源,完全不需要提前创建updates实体源表。
多条数据批量手动UPSERT示例
如果要一次性传入多条数据,只需要在SELECT里用UNION ALL拼接即可:
MERGE INTO users USING ( SELECT 123 AS userId, '北京市朝阳区' AS address UNION ALL SELECT 456 AS userId, '上海市浦东新区' AS address UNION ALL SELECT 789 AS userId, '广州市天河区' AS address ) AS updates ON users.userId = updates.userId WHEN MATCHED THEN UPDATE SET address = updates.address WHEN NOT MATCHED THEN INSERT (userId, address) VALUES (updates.userId, updates.address)
如果使用Delta Lake的Python/Scala API操作,也可以直接构造一个临时DataFrame作为数据源传入,不需要提前持久化成表,灵活度更高。
内容的提问来源于stack exchange,提问作者MetallicPriest
相关产品推荐
相关产品推荐

