如何使用 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
如何使用 jupyter notebook 在 pyspark 中的 Hive 上使用 %sql Magic 字符串启用 spark SQL