如果找到匹配项,则在 master 中插入增量记录并更新现有列值

我有一个

tcgetattr

还有一个daily表,一个daily表可以有以下条件的数据

1) 全新记录 2) 更新现有记录的日期列

#+-----------+----------+-------------+
#| Name      | Gender   | date        |
#+-----------+----------+-------------+
#|  Tom      |   M      |  2021-02-15 | 
#|  Bob      |   M      |  2021-03-02 |
#|  Kelly    |   F      |  2021-06-01 |

预期输出 主表应该每天都有新记录进来 加上如果任何名称与主表匹配,则从每日更新新日期

#+-----------+----------+-------------+
#| Name      | Gender   | date        |
#+-----------+----------+-------------+
#|  Tom      |   M      |  2021-03-20 | date updated 
#|  suzen    |   F      |  2021-06-10 | new records 

为方便起见,我们将名称作为两个表的唯一标识符

有一种方法可以在完全外部连接这两个表并获得结果

#+-----------+----------+-------------+
#| Name      | Gender   | date        |
#+-----------+----------+-------------+
#|  Tom      |   M      |  2021-03-20 | date updated form daily
#|  Bob      |   M      |  2021-03-02 |
#|  Kelly    |   F      |  2021-06-01 |
#|  suzen    |   F      |  2021-06-10 | New record 

如何以更好、更高效的方式实现预期输出

aa4892278 回答:如果找到匹配项,则在 master 中插入增量记录并更新现有列值

要根据您的条件创建新表(数据框),您的解决方案很好。
但是如果你想使用每日表更新主表,delta 支持使用合并向上插入表:

from delta.tables import *

master_table = DeltaTable.forPath(spark,"/path/to/master")
daily_table = DeltaTable.forPath(spark,"/path/to/daily")

master_table.alias("master").merge(
    daily_table.alias("daily"),"master.Name = daily.Name") \
  .whenMatchedUpdate(set = { "Gender" : "daily.Gender","date": "daily.date"} ) \
  .whenNotMatchedInsert(values =
    {
      "Name": "daily.Name","Gender": "daily.Gender","date": "daily.date"
    }
  ) \
  .execute()

或使用 SQL

MERGE INTO master
USING daily
ON master.Name = daily.Name
WHEN MATCHED THEN
  UPDATE SET master.Gender = daily.Gender,master.date = daily.date
WHEN NOT MATCHED
  THEN INSERT (Name,Gender,date) VALUES (Name,date)
本文链接:https://www.f2er.com/5383.html

大家都在问