使用多列更新 Apache Spark / Databricks 中的表
Posted
技术标签:
【中文标题】使用多列更新 Apache Spark / Databricks 中的表【英文标题】:Update table in Apache Spark / Databricks using multiple columns 【发布时间】:2020-10-28 14:06:29 【问题描述】:我正在尝试根据与另一个表的多个列的匹配来更新一个表。我已经尝试了下面显示的内容,但我得到了显示的错误。这是怎么做到的?
update my_table set flag = '1' where (patient_id, org) in (
select distinct (patient_id, org) from enc where lower(enc_type) like '%visit%'
)
错误:
Error in SQL statement: AnalysisException: IN/EXISTS predicate sub-queries can only be used in Filter/Join and a few commands: 'DeltaUpdateTable [post_partum#1911], [1], named_struct
--- 编辑-------------------
以下是基于复杂查询更新表的完整示例,该查询基于已接受答案中给出的文档工作。
MERGE INTO events eve
USING (
select
enc.org as org,
enc.person_id as person_id,
min(encounter_date) as visit_day
from
enc
join events eve on enc.org = eve.org and enc.person_id = eve.person_id and eve.is_post_partum = 1
where
lower(enc.enc_type) like '%visit%'
group by 1, 2
) visits
ON eve.org = visits.org and eve.person_id = visits.person_id
WHEN MATCHED THEN
UPDATE SET eve.delivery_date = visits.visit_day
;
【问题讨论】:
【参考方案1】:首先,确保您使用 Delta Lake 作为表格格式。其次,我认为您正在寻找 Upserts,即defined as
如果行不存在,则将行插入数据库表中,如果存在则更新它们。
为此,您需要将MERGE
与UPDATE
结合使用。这是匹配表达式的示例:
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)
在 Databricks 文档here 中查看更多信息。
【讨论】:
谢谢,根据您提供的文档链接,我能够做我需要做的事情。以上是关于使用多列更新 Apache Spark / Databricks 中的表的主要内容,如果未能解决你的问题,请参考以下文章
使用多列作为存储在 Apache Spark 中的数组中的键来连接两个 Dataframe
Apache Spark Dataframe Groupby agg() 用于多列