【问题标题】:Merge delta data into an external table using hive's merge statement使用 hive 的合并语句将增量数据合并到外部表中
【发布时间】:2018-06-12 04:42:27
【问题描述】:
我有一个映射到 Hive(EMR-5.11.0 上的 v2.3.2)中的外部表,我需要大约每周更新一次新数据。合并由一个条件 upsert 语句组成。
表的位置在 s3 中,数据始终存在(创建一次,我们只需要用新数据更新它)。
我已阅读有关在 Hive 中使用事务表 (https://dzone.com/articles/update-hive-tables-the-easy-way-part-2-hortonworks) 上的 ACID 功能合并数据的博客,但据我所知,唯一的解决方案是将我的外部表复制到临时 Hive 内部表,即集群和事务性,那么只有在该表上我才能进行合并并用新合并的数据覆盖我的原始数据。
这个表很大(大约 10GB 的数据),所以我想避免在每次合并操作之前复制它。
有没有办法创建内部表并将其映射到现有数据?还是除了合并语句之外还有其他方法可以对 Hive 外部表执行 upsert?
提前非常感谢!
【问题讨论】:
标签:
hadoop
hive
emr
acid
orc
【解决方案1】:
如果你想使用合并进行upsert,那么你必须在托管配置单元内部表中有数据,如果你不想复制文件,简单的解决方案
-
创建类似结构的内表
创建表table1(
id int,
名称字符串,
更新日期
)
由 (id) 聚集到存储为 ORC 的 2 个桶中
tblproperties("transactional"="true","skip.header.line.count"="1");
-
将数据从外部表插入到内部表中
插入表 table1
从您的外部表中选择 *;
-
运行合并语句来更新内部表
设置 hive.support.concurrency = true;
设置 hive.enforce.bucketing = true;
设置 hive.exec.dynamic.partition.mode = nonstrict;
设置 hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
设置 hive.compactor.initiator.on = true;
设置 hive.compactor.worker.threads = 1;
合并成
表格1
使用
每日饲料
在
DailyFeed.id=table1.id
当匹配和 table1.nameDailyFeed.name
然后
更新集名称= DailyFeed.name
当不匹配时
插入值(DailyFeed.id、DailyFeed.name、CURRENT_DATE)
;
覆盖你的基础文件导出内表
hive -e '设置 hive.cli.print.header=true;选择 * 从表 1' | sed 's/[[:space:]]+/,/g' > /home/user1/table1.csv
或者
insert overwrite local directory '/home/user1/table1.csv' row format delimited fields terminated by ',' SELECT * FROM table1;
希望这将有助于解决您的问题
谢谢
尼禄