我在hive中Map了一个外部表(emr-5.11.0上的v2.3.2),我需要每周更新一次新的数据。合并由条件upsert语句组成。
表的位置在s3中,数据总是在那里(创建一次,我们只需要用新数据更新它)。
我读过一篇关于在事务表上使用acid特性在hive中合并数据的博客(https://dzone.com/articles/update-hive-tables-the-easy-way-part-2-hortonworks),但据我所知,唯一的解决方案是将我的外部表复制到临时配置单元内部表,该表是集群的和事务性的,只有在那个表上,我才能进行合并,并用新的合并数据覆盖我的原始数据。
这个表非常大(大约10gb的数据),所以我希望避免在每次合并操作之前复制它。
有没有办法创建内部表并将其Map到现有数据?或者除了merge语句之外,还有其他方法可以对配置单元外部表执行upsert吗?
提前多谢了!
1条答案
按热度按时间a2mppw5e1#
如果要使用merge进行upsert,则必须在托管配置单元内部表中包含数据,如果不想复制文件,这是一个简单的解决方案
创建类似结构的内部表
创建表table1(id int,name string,
updateDate date)按(id)聚集到2个存储桶中,存储为orc tblproperty(“transactional”=“true”,“skip.header.line.count”=“1”);
从外部表向内部表插入数据
插入表1从外部表中选择*;
运行merge语句来更新内部表
设置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;在dailyfeed.id=table1.id(匹配时)和table1.name(不匹配时)上使用dailyfeed合并到表1中,然后更新set name=dailyfeed.name(不匹配时),然后插入值(dailyfeed.id,dailyfeed.name,当前日期);
覆盖基本文件导出内部表
hive-e'set hive.cli.print.header=true;从table1'| sed's/[[:space:]+/,/g'>/home/user1/table1.csv中选择*
或
希望这将有助于解决您的问题
谢谢
尼莱什