【问题标题】:Can Pig be used to LOAD from Parquet table in HDFS with partition, and add partitions as columns?可以使用 Pig 从 HDFS 中的 Parquet 表中加载分区,并将分区添加为列吗?
【发布时间】:2015-11-11 00:04:14
【问题描述】:

我有一个 Impala 分区表,存储为 Parquet。我可以使用 Pig 从这个表中加载数据,并将分区添加为列吗?

Parquet 表定义为:

create table test.test_pig (
    name: chararray,
    id bigint
)
partitioned by (gender chararray, age int)
stored as parquet;

Pig 脚本是这样的:

A = LOAD '/test/test_pig' USING parquet.pig.ParquetLoader AS (name: bytearray, id: long);

但是,DUMP A 时,genderage 会丢失。仅显示nameid

我试过了:

A = LOAD '/test/test_pig' USING parquet.pig.ParquetLoader AS (name: bytearray, id: long, gender: chararray, age: int);

但我会收到如下错误:

错误 org.apache.pig.tools.grunt.Grunt - 错误 1031:不兼容 模式:左边是“名称:字节数组,id:长,性别:字节数组,年龄:int”, 右边是“name:bytearray,id:long”

希望在这里得到一些建议。谢谢!

【问题讨论】:

    标签: apache-pig hdfs database-partitioning parquet


    【解决方案1】:

    您应该使用 org.apache.hcatalog.pig.HCatLoader 库进行测试。

    通常,Pig 支持读取/写入分区表;

    阅读:

    此加载语句将加载指定表的所有分区。 /* myscript.pig */ A = LOAD 'tablename' USING org.apache.hcatalog.pig.HCatLoader(); ... ... 如果只需要指定表的部分分区,请在数据流中紧跟加载语句后包含分区过滤语句。 (但是,在脚本中,过滤器语句可能不会紧跟其加载语句。)过滤器语句可以包括分区和非分区列的条件。

    https://cwiki.apache.org/confluence/display/Hive/HCatalog+LoadStore#HCatalogLoadStore-RunningPigwithHCatalog

    HCatOutputFormat 将在必要时触发动态分区使用(如果未指定键值),并将检查数据以适当地写出。

    https://cwiki.apache.org/confluence/display/Hive/HCatalog+DynamicPartitions

    但是,我认为这还没有经过 parquet 文件的正确测试(至少 Cloudera 的人没有):

    Parquet 尚未使用 HCatalog 进行测试。没有 HCatalog,Pig 无法正确读取动态分区表;这适用于所有文件格式。

    http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cdh_ig_parquet.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      相关资源
      最近更新 更多