从 Impala 更新vertica的巨大记录

fzsnzjdm  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(385)

我在vertica有50列的表a,在impala有20列的表b。表a中有数百万条按日期排序的记录,并希望在特定日期每天更新一次来自 Impala 的记录。在使用java时,我正在通过收集更新1000个批次的100万条记录,但需要更多的时间,有时是一天。我还尝试为某一天创建新的表副本,并更新到该表中,然后再次将所有记录重新插入到。但没有表现效果。
对于同样的问题,最好的方法是什么,这样我就能在更短的时间内完成同样的任务?

9nvpjoqh

9nvpjoqh1#

在vertica中创建20列的表b,就像在impala中一样。
构建一个连接impala和vertica的java程序。在那个程序中,批量读取 SELECT * FROM impala.B 并将该内存用作目标语句的主机变量 INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) .
创建(或保留)暂存表 stg_A 具有与50列表a相同的结构和主键(理想情况下是一列)。
截断暂存表,然后 INSERT /*+DIRECT */ INTO stg_A SELECT B.*, A.col21,A.col22 .... A.col50 FROM B JOIN A ON stg_A.id=A.id (如果 id 是主键)。这确保20列来自 Impala ,其余的来自目标。
最后,运行优化合并:

MERGE /*+DIRECT*/
INTO A t
USING stg_A s
 ON s.id         = t.id
WHEN MATCHED THEN UPDATE SET
  id    = s.id
, col02 = s.col02
, col03 = s.col03
, col04 = s.col04
, col05 = s.col05
[...]    
    , col50 = s.col50
WHEN NOT MATCHED THEN INSERT VALUES (
  s.s.id
, s.s.col02
, s.s.col03
, s.s.col04
, s.s.col05
, s.[...]
, s.s.col50
);

当explain计划有一个用于insert的完整访问路径和一个用于delete的完整访问路径,而没有用于merge的访问路径时,您将看到您的合并是一个优化的合并。

相关问题