我有一个文件 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 无法写入包含数据的分区(或者我错过了什么?) 如何管理加载到现有分区(在非空的非分区表上)? 您是否读取分区,将其与新数据合并,删除分区(如何?)并将其作为新分区插入?
最佳答案
来自 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 字符串) 存储为兽人;
使用 org.apache.hcatalog.pig.HCatStorer('build_num=${build_num}';
将 LoadFile 存储到“partition_pk”中只是不要在查询中包含 build_num 分区。我通常将 build_num 设置为运行作业时的时间戳;
关于apache-pig - PigLatin - 将数据插入现有分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966834/