Apache Spark SQL 是否支持类似于 Oracle 的 MERGE SQL 子句的 MERGE 子句?
MERGE into <table> using (
select * from <table1>
when matched then update...
DELETE WHERE...
when not matched then insert...
)
最佳答案
Spark 确实支持使用 Delta Lake 作为存储格式的 MERGE 操作。首先要做的是使用 delta
格式保存表,以提供对事务功能的支持,并支持使用 spark 进行 DELETE/UPDATE/MERGE 操作
python /斯卡拉:
df.write.format("delta").save("/data/events")
SQL:CREATE TABLE events (eventId long, ...) USING delta
一旦表存在,您就可以运行常用的 SQL Merge 命令:
MERGE INTO events
USING updates
ON events.eventId = updates.eventId
WHEN MATCHED THEN
UPDATE SET events.data = updates.data
WHEN NOT MATCHED
THEN INSERT (date, eventId, data) VALUES (date, eventId, data)
该命令在 Python/Scala 中也可用:
DeltaTable.forPath(spark, "/data/events/")
.as("events")
.merge(
updatesDF.as("updates"),
"events.eventId = updates.eventId")
.whenMatched
.updateExpr(
Map("data" -> "updates.data"))
.whenNotMatched
.insertExpr(
Map(
"date" -> "updates.date",
"eventId" -> "updates.eventId",
"data" -> "updates.data"))
.execute()
要支持 Delta Lake 格式,您还需要将 delta 包作为 spark 作业中的依赖项:
<dependency>
<groupId>io.delta</groupId>
<artifactId>delta-core_x.xx</artifactId>
<version>xxxx</version>
</dependency>
参见 https://docs.delta.io/latest/delta-update.html#upsert-into-a-table-using-merge了解更多详情
关于sql - Apache Spark SQL 是否支持 MERGE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46613907/