【问题标题】:PigLatin - insert data into existing partition?PigLatin - 将数据插入现有分区?
【发布时间】:2014-04-09 15:12:19
【问题描述】:

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

【问题讨论】:

    标签: apache-pig hcatalog


    【解决方案1】:

    来自 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_pk(值字符串) 分区(日期字符串,build_num 字符串) 存储为兽人;

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

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

    【讨论】:

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

    尝试使用多个分区:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2019-03-02
      • 2022-08-20
      • 2020-02-10
      相关资源
      最近更新 更多