【问题标题】:Kudu Conditional UPSERT INTOKudu 条件 UPSERT INTO
【发布时间】:2020-09-19 00:58:33
【问题描述】:

Kudu 是否支持UPSERT INTOUPDATE 部分的条件?

我能否提供一个条件子句,仅根据插入值和目标表之间的比较来更新给定值? 实际用例是用最新的更新时间戳列。

这是我想象的行为。

CREATE TABLE my_first_table
(
  id INT,
  name STRING,
  status INT,
  PRIMARY KEY(id)
)
PARTITION BY HASH PARTITIONS 4
STORED AS KUDU;

INSERT INTO my_first_table VALUES (1, "lee", 101), (2 "shiv", 102), (3,"bob", 103);

--CONDITION FALSE, UPDATE NOT PERFORMED
UPSERT INTO my_first_table AS t 
VALUES (3, "bobby", 100) AS v 
WHERE v.status > t.status

+----+------+--------+
| id | name | status |
+----+------+--------+
| 1  | lee  | 101    |
| 2  | shiv | 102    |
| 3  | bob  | 103    |
+----+------+--------+

--CONDITION TRUE, UPDATE PERFORMED
UPSERT INTO my_first_table AS t 
VALUES (3, "bobby", 100) AS v 
WHERE v.status < t.status

+----+------+--------+
| id | name | status |
+----+------+--------+
| 1  | lee  | 101    |
| 2  | shiv | 102    |
| 3  | bobby| 100    |
+----+------+--------+

在3不存在的情况下,应该插入。

如果没有,是否有一个优雅的解决方法?

【问题讨论】:

    标签: impala apache-kudu


    【解决方案1】:

    我找到的一个解决方案是使用LEFT JOIN 并在SELECT 表达式中进行过滤。因此,假设我们有一个表 to_upsert 与目标表相同,其中包含我们所有潜在的 upserts...

    INSERT INTO to_upsert VALUES (3, "bobby" 100), (5, "newgal", 600);
    
    UPSERT INTO my_first_table
    SELECT to_upsert.id, to_upsert.name, to_upsert.status
    FROM to_upsert
    LEFT JOIN my_first_table ON to_upsert.id = my_first_table.id
    WHERE my_first_table.status > to_upsert.status OR my_first_table.id IS NULL;
    
    SELECT * FROM my_first_table;
    +----+--------+--------+
    | id | name   | status |
    +----+--------+--------+
    | 3  | bobby  | 100    |
    | 1  | lee    | 101    |
    | 2  | shiv   | 102    |
    | 5  | newgal | 600    |
    +----+--------+--------+
    

    感谢大家收看本期看我学sql。

    【讨论】:

    • 感谢您回答您的问题 :)
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2020-12-01
    • 1970-01-01
    • 2013-04-12
    • 2017-07-18
    • 2010-11-09
    相关资源
    最近更新 更多