使用多列更新 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

如果行不存在,则将行插入数据库表中,如果存在则更新它们。

为此,您需要将MERGEUPDATE 结合使用。这是匹配表达式的示例:

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 数据框列爆炸为多列

使用多列作为存储在 Apache Spark 中的数组中的键来连接两个 Dataframe

Apache Spark Dataframe Groupby agg() 用于多列

使用spark对hive表中的多列数据判重

获取 Apache Spark 中重复行的 ID(考虑所有其他列)

Apache Spark Codegen Stage 超过 64 KB