Apache pig PigLatin-是否将数据插入现有分区?

Apache pig PigLatin-是否将数据插入现有分区?,apache-pig,hcatalog,Apache Pig,Hcatalog,我有一个文件test\u file\u 1.txt包含: 20140101,value1 20140102,value2 20140103,value3 20140104,value4 以及包含以下内容的文件test_file_2.txt: 20140101,value1 20140102,value2 20140103,value3 20140104,value4 在HCatalog中有一个表: create table stage.partition_pk (value string

我有一个文件
test\u file\u 1.txt
包含:

20140101,value1
20140102,value2
20140103,value3
20140104,value4
以及包含以下内容的文件
test_file_2.txt

20140101,value1
20140102,value2
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\u pk
包含四个分区-一切正常

但假设有另一个包含数据的文件,该文件应该插入现有分区之一。 Pig无法写入包含数据的分区(或者我遗漏了什么?) 如何管理加载到现有分区(在非空的非分区表上)?
您是否阅读分区、将其与新数据合并、删除分区(如何?)并将其作为新分区插入?

来自HCatalog的网站,它说:“一旦创建了分区,就不能向其中添加、删除或更新记录。”。因此,根据HCatalog的性质,您不能将数据添加到已经包含数据的现有分区中

他们正在研究的问题有很多。有些bug已在Hive 0.13中修复:

(仍未解决)-用于跟踪其他错误的错误 (在0.13中解析)-可变的独立表属性 (仍未解决)-特定于动态分区 (在0.13中解析)-特定于静态分区 (仍未解决)-将DDL支持添加到HCatalog 基本上,如果您不想使用动态分区,那么0.13可能适合您。您只需要记住设置适当的属性

我发现对我有效的方法是创建另一个我称之为build_num的分区键,然后通过命令行传递这个参数的值,并在store语句中设置它。像这样:

创建表stage.partition_pk(值字符串) 分区依据(日期字符串、生成数量字符串) 储存为兽人

使用org.apache.hcatalog.pig.HCatStorer('build_num=${build_num}'将加载文件存储到'partition_pk'中


只是不要在查询中包含build_num分区。我通常在运行作业时将build_num设置为时间戳;

尝试使用多个分区:

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');

因此,现在您可以通过增加计数器再次将数据存储到同一个日期分区中。

than作为您的答案。您已经写道:基本上,如果您不想使用动态分区,那么0.13可能适合您。您只需要记住设置适当的属性。您指的是哪个参数?哪个bug解决了我的问题sue?ThanksI更新了我的答案,加入了一个适合我的解决方案。谢谢你添加了额外的分区。你在查询表的时候检查了这个分区的影响了吗?这不是缩短了响应时间吗?大约10k个分区的速度开始变慢。然后你需要开始调整你的元存储。我没有看到过由于一个表的多个分区而导致的任何减速。如果您打算每隔几分钟更新一次此表,那么这将不是适合您的解决方案。顺便说一句,我有一个单独的进程,每天运行一次或两次。它会获取给定日期的所有数据和所有生成编号,并将数据插入到新的生成编号中。然后删除当天小于新分区的build_num分区。这样可以减少文件数量,也可以减少分区总数。