在Pig Latin中将行李换成阵列

时间:2013-06-20 22:22:19

标签: hadoop apache-pig

我正在对某些数据集进行一些转换,需要发布到一个看起来很健全的格式。当我运行describe:

时,我的最终设置看起来像这样
{memberId: long,companyIds: {(subsidiary: long)}}

我需要它看起来像这样:

{memberId: long,companyIds: [long] }

其中companyIds是long类型的数组的关键?

我真的在努力学习如何以这种方式操纵事物?有任何想法吗?我已经尝试使用FLATTEN和其他命令来了解情况。我正在使用AvroStorage将文件写入此架构:

我需要将此数据写入的字段模式如下所示:

"fields": [
        { "name": "memberId", "type": "long"},
        { "name": "companyIds", "type": {"type": "array", "items": "int"}}
      ]

2 个答案:

答案 0 :(得分:2)

PIG中没有数组类型(http://pig.apache.org/docs/r0.10.0/basic.html#data-types)。但是,如果您只需要一个外观漂亮的输出,并且如果您在companyIds中没有太多元素,您可能需要编写一个简单的UDF,将该包转换为一个漂亮的格式化字符串。

Java代码

public class BagToString extends EvalFunc<String>
{
    @Override
    public String exec(Tuple input) throws IOException
    {
        List<String> strings = new ArrayList<String>();
        DataBag bag = (DataBag) input.get(0);
        if (bag.size() == 0) {
            return null;
        }
        for (Iterator<Tuple> it = bag.iterator(); it.hasNext();) {
            Tuple t = it.next();
            strings.add(t.get(0).toString());
        }
        return StringUtils.join(strings, ":");
    }
}

PIG脚本

 foo = foreach bar generate memberId, BagToString(companyIds);

答案 1 :(得分:1)

我知道这有点旧,但我最近遇到了同样的问题。

基于avrostorage documentation,使用最新版本的猪和avrostorage,可以直接将袋子投射到avro阵列。

在您的情况下,您可能需要以下内容:

STORE blah INTO 'blah' USING AvroStorage('schema','{your schema}');

架构中的数组字段为

{  
    "name":"companyIds",
    "type":[  
        "null",
        {  
            "type":"array",
            "items":"long"
        }
    ],
    "doc":"company ids"
}