PigLatin - 将数据插入现有分区?

时间:2014-04-09 15:12:20

标签: apache-pig hcatalog

我有一个文件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无法写入包含数据的分区(或者我错过了什么?) 如何管理加载到现有分区(非空的非分区表)? 你读取分区,将它与新数据联合,删除分区(如何?)并将其作为新分区插入?

2 个答案:

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

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