2

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

4

2 回答 2

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 语句中设置它。像这样:

创建表stage.partition_pk(值字符串)分区(日期字符串,build_num字符串)存储为orc;

使用 org.apache.hcatalog.pig.HCatStorer('build_num=${build_num}'; 将 LoadFile 存储到“partition_pk”中

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

于 2014-05-28T23:20:47.127 回答
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');

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

于 2016-11-21T14:05:09.077 回答