从 impala 更新 vertica 中的巨大记录

Posted

技术标签:

【中文标题】从 impala 更新 vertica 中的巨大记录【英文标题】:Update huge record in vertica from impala 【发布时间】:2017-02-07 08:50:13 【问题描述】:

我在 vertica 中有 50 列的表 A,在 impala 表 B 中有 20 列。表 A 具有数百万条记录,并且希望在特定日期每天一次从 impala 更新该记录。在使用 java 时,我通过收集更新 1000 批 1 miliion 记录,但需要更多时间,有时是一天。 我还尝试为特定日期创建 A 的新表副本并更新到该副本,然后再次将所有记录重新插入 A。但没有性能影响。

最好的方法是什么,以便我可以在更短的时间内完成相同的任务?

【问题讨论】:

【参考方案1】:

在 Vertica 中创建具有 20 列的表 B,就像在 impala 中一样。

构建一个连接到 impala 和 Vertica 的 Java 程序。在该程序中,将SELECT * FROM impala.B 批量读取到内存中的数组中,并将同一内存用作目标语句INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 的主机变量。

创建(或保留)一个与 50 列表 A 具有相同结构和相同主键(理想情况下为一列)的临时表 stg_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
);

当解释计划有一个完整的 INSERT 访问路径和一个完整的 DELETE 访问路径,而没有 MERGE 的访问路径时,您将看到您的合并是优化的合并。

【讨论】:

您好,感谢您的回复。我尝试了另一种方法,例如从 impala 中选择 * 并在 vertica temp 中创建具有相同以上 select* 列的表,并将所有值插入到 temp 中。然后更新 vertica B,将 temp 与类似键的连接和日期条件单个查询进行比较。现在只是检查性能.. 它现在工作正常... UPDATE A ts SET column1=t.column1 FROM temp t WHERE ts.column2=t.column2 AND ts.column3=t.column3 and date(ts.column4) ='2017-02-08';

以上是关于从 impala 更新 vertica 中的巨大记录的主要内容,如果未能解决你的问题,请参考以下文章

使用vertica数据库系统获取java jpa的行级锁

从 vertica 导入 sqoop 失败

蓝色扑克 - 1961年雪佛兰 Impala

惊叹吧1962年 雪佛兰 Impala

无法从 Spark 显示 Vertica 表

骚紫冲天 -1964年雪佛兰 IMPALA