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

zi8p0yeb  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(255)

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

vltsax25

vltsax251#

尝试使用多个分区:

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

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

niknxzdl

niknxzdl2#

来自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 (仍然没有解决)-将ddl支持添加到hcatalog基本上,看起来如果您不想使用动态分区,那么0.13可能适合您。您只需要记住设置适当的属性
我发现对我有效的方法是创建另一个分区键,我称之为build\ num,然后通过命令行传递这个参数的值,并在store语句中设置它。像这样:
创建表stage.partition\u pk(value string)分区依据(date string,build\u num string)存储为orc;
使用org.apache.hcatalog.pig.hcatstorer('build\u num=${build\u num}'将loadfile存储到'partition\u pk'中;
只是不要在查询中包含build\u num分区。我通常在运行作业时将build_num设置为时间戳;

相关问题