我正在对某些数据集进行一些转换,需要发布到一个看起来很健全的格式。当我运行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"}}
]
答案 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"
}