我有一个文件test_file_1.txt
,其中包含:
20140101,value1
20140102,value2
和文件test_file_2.txt
包含:
20140103,value3
20140104,value4
在HCatalog中有一张表:
create table stage.partition_pk (value string)
Partitioned by(date string)
stored as orc;
这两个脚本运行良好:
脚本1:
LoadFile = LOAD 'test_file_2.txt' using PigStorage(',') AS (date : chararray, wartosc : chararray);
store LoadFile into 'stage.partition_pk' using org.apache.hcatalog.pig.HCatStorer();
脚本2:
LoadFile = LOAD 'test_file_2.txt' using PigStorage(',')
AS (date : chararray, wartosc : chararray);
store LoadFile into 'stage.partition_pk' using org.apache.hcatalog.pig.HCatStorer();
表partition_pk
包含四个分区 - 一切都按预期进行。
但是,让我们说,还有另一个文件包含应该插入现有分区之一的数据。 Pig无法写入包含数据的分区(或者我错过了什么?) 如何管理加载到现有分区(非空的非分区表)? 你读取分区,将它与新数据联合,删除分区(如何?)并将其作为新分区插入?
答案 0 :(得分:2)
来自HCatalog的网站https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat,它说:“创建分区后,无法将记录添加到其中,从中删除或在其中进行更新。”因此,根据HCatalog的性质,您无法将数据添加到已包含数据的现有分区中。
他们正在努力解决这个问题。一些错误已在Hive 0.13中修复:
https://issues.apache.org/jira/browse/HIVE-6405(尚未解决) - 用于跟踪其他错误的错误 https://issues.apache.org/jira/browse/HIVE-6406(已在0.13中解决) - 可变的单独表属性 https://issues.apache.org/jira/browse/HIVE-6476(仍未解决) - 特定于动态分区 https://issues.apache.org/jira/browse/HIVE-6475(已在0.13中解决) - 特定于静态分区 https://issues.apache.org/jira/browse/HIVE-6465(尚未解决) - 向HCatalog添加DDL支持 基本上,如果您不想使用动态分区,那么0.13可能对您有用。您只需要记住设置适当的属性
我发现对我有用的是创建另一个我称之为build_num的分区键。然后,我通过命令行传递此参数的值,并在store语句中设置它。像这样:
create table stage.partition_pk(value string) 分区为(日期字符串,build_num字符串) 存储为orc;
使用org.apache.hcatalog.pig.HCatStorer('build_num = $ {build_num}';
将LoadFile存储到'partition_pk'只是不要在查询中包含build_num分区。我通常在运行作业时将build_num设置为时间戳;
答案 1 :(得分:1)
尝试使用多个分区:
create table stage.partition_pk (value string) Partitioned by(date string, counter string) stored as orc;
存储看起来像这样:
LoadFile = LOAD 'test_file_2.txt' using PigStorage(',') AS (date : chararray, wartosc : chararray);
store LoadFile into 'stage.partition_pk' using org.apache.hcatalog.pig.HCatStorer('date=20161120, counter=0');
现在,您可以通过增加计数器将数据再次存储到同一个日期分区中。