【问题标题】:How can I using Pig scripts to generate nested Avro field?如何使用 Pig 脚本生成嵌套的 Avro 字段?
【发布时间】:2014-10-18 05:51:50
【问题描述】:

我是 Pig 新手,我的输入数据格式为

Record1:
{
  label:int,
  id: long
},
Record 2:
{
 ...
}
...

而我想要的输出是得到

Record 1:
{
  data:{
    label:int,
    id:long
  }
}, 
Record 2:
{
  ...
}
...

我试过了:

result = FOREACH input GENERATE (id, label) AS data;

但这会导致嵌套的元组结构如下所示:

Record 1:
{
  data:{
   TUPLE_1:{
      label:int,
      id: long
   }
  }
}

我怎么能去掉一个包为“TUPLE_1”,看起来我错过了一个微不足道的设置。

【问题讨论】:

  • 你是如何得到这些结构的?你在用DESCRIBE吗?

标签: hadoop apache-pig


【解决方案1】:

您可能需要在存储数据时指定架构。 如果你使用 org.apache.pig.piggybank.storage.avro.AvroStorage,它可以将 schema 定义作为参数。

result = FOREACH input GENERATE label:int, id:long;
STORE result INTO 'result.avro' USING org.apache.pig.piggybank.storage.avro.AvroStorage('schema', '{"type": "record","name": "data","fields": [{"name": "label","type": "int"},{"name": "id", "type": "long"}]}');

【讨论】:

    【解决方案2】:

    我的最终解决方案是这样的:

    首先要创建具有特定架构的 avro 文件,我确保为 AvroStorage 执行以下架构配置:

    STORE sth INTO 'someplace' USING AvroStorage('schema','
      {
        ### AN AVRO SCHEMA JSON STRING ###
      }
    ');
    

    我发现使用这种缩进确实有助于使架构定义更清晰。而且我还需要确保我转义了所有特殊字符,尤其是引号(它们可能存在于“doc”中,这很棘手)。

    那么为了使某物有正确的猪结构来存储,我需要正确地构建整个数据结构。如果已经有目标数据文件的一些示例,则可以使用DESCRIBE 一个好技巧。在我之前的问题中,代码应该是这样的:

    in = LOAD '$INPUT_PATHS' USING AvroStorage();
    in = FOREACH in GENERATE foo.label AS label, bar.id AS id;
    out = FOREACH in GENERATE TOMAP('id', (long)id, 'label', (chararray)label) AS data;
    RMF $OUTPUT_PATH;
    STORE out INTO '$OUTPUT_PATH USING AvroStorage('schema',
      {
        "type": "records",
        "name": "XXItem",
        "namespace": "com.xxx.xxx",
        "fields": [
          {
           "name": "data",
           "type":  {"type": "map", "values" : ["string", "long", "int"]}
          }
        ]
      }
    ');
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多