sql - Apache Spark SQL 是否支持 MERGE 子句?

标签 sql hadoop apache-spark apache-spark-sql databricks

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/

相关文章:

sql - 创建没有任何外键的数据库实体图

sql - 数据库字尾字符数限制?

sql - 如何在sql脚本中从另一个sql server服务器表中选择数据?

scala - 使用spark scala将行转换为列

mysql - 如何在 MySQL 中选择其值位于 json 数组中的列

python - 为什么打印出错误的结果?

hadoop - Map 输出格式与 hadoop 中的 reduce 输出格式不同

python - 如何将 numpy.array 作为新列添加到 pyspark.SQL DataFrame?

r - 如何使用 sparklyr 为 Apache Spark 实现斯坦福 CoreNLP 包装器?

apache-spark - 如何合并pyspark中的重复列?