如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

Posted

技术标签:

【中文标题】如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表【英文标题】:How to update a Databricks Delta table with inner join in Databricks using Spark sql 【发布时间】:2019-02-14 15:12:30 【问题描述】:

我必须使用与其他表的内连接来更新表列。我尝试使用下面的 sql。但是我在 Databricks 中遇到错误(SQL 语句中的错误:ParseException: 不匹配的输入''期待'WHEN')。我尝试了不同的更新表格的方法。有人可以帮助我解决这个问题吗?

%sql
merge into test a using test_1 b
on (a.id_num=b.id_num)
when matched then
update set a.name=b.name;

【问题讨论】:

你想更新什么? ORC 表? 不,这是一个普通表。我想更新测试表的某些列,这些列也将出现在 test_1 中。在上面的代码中,我想更新测试表的名称列。我有也试过下面的查询。更新 test t1 set name=(select t2.name from test_1 t2 where t1.id_num=t2.id_num ) where exists (select 1 from test_1 where t1.id_num=t2.id_num)。它也给了我一些错误。 除了使用合并查询(例如 Update Table1 join Table2 on Table1.ID = Table2.ID )之外,还有其他更新方式吗? 【参考方案1】:

您的表格必须是 DELTA 格式。是吗?

我认为你的命令没问题。

https://docs.databricks.com/spark/latest/spark-sql/language-manual/merge-into.html

【讨论】:

【参考方案2】:

如果我的问题正确,您想使用数据块合并到构造中,通过将表 1(例如目标)列连接到其他表 2(源)来更新表 1(例如目标)列

合并到目的地 使用更新 ON destination.primary_key = source.foregin_key 当匹配然后 UPDATE SET column1=updates.column1

如果源表和目标表中不存在行进行,则可以扩展相同的查询以插入数据。

注意 - 我的回答是基于我在开始时所做的假设。如果您可以进一步阐述,这将有助于更好地理解您的问题

【讨论】:

【参考方案3】:

这是因为 Databricks 运行时版本,您需要使用Databricks Runtime version 5.1 或更高版本对 Delta Table 进行查询。但是对于合并操作,首先需要有一个 Delta 表。

【讨论】:

【参考方案4】:

您使用的查询是正确的。失败的原因是您没有使用增量表,在您的情况下 test 和 test_1 应该是增量表。

【讨论】:

以上是关于如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Spark SQL 的情况下对 Spark 中的数据帧进行排序?

如何正确处理 spark.sql.AnalysisException

如何在 Spark SQL 中使用连字符转义列名

如何使用 jupyter notebook 在 pyspark 中的 Hive 上使用 %sql Magic 字符串启用 spark SQL

如何在 SQL 中使用 Apache Spark 制作第一行标题

如何使用 JAVA 在 Spark SQL 中基于单列删除重复行