用pig拉丁语将包转换为数组

4szc88ey  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(445)

我正在一些数据集上做一些转换,需要发布到一个看起来正常的格式。当我运行时,当前我的最后一组是这样的描述:

  1. {memberId: long,companyIds: {(subsidiary: long)}}

我需要它看起来像这样:

  1. {memberId: long,companyIds: [long] }

哪里 companyIds 类型为long的id数组的键是否为long?
我真的很纠结于如何用这种方式操纵事物?有什么想法吗?我试过用 FLATTEN 以及其他命令。我正在使用avrostorage将文件写入此架构:
我需要将此数据写入的字段架构如下所示:

  1. "fields": [
  2. { "name": "memberId", "type": "long"},
  3. { "name": "companyIds", "type": {"type": "array", "items": "int"}}
  4. ]
hmtdttj4

hmtdttj41#

pig中没有数组类型(http://pig.apache.org/docs/r0.10.0/basic.html#data-类型)。但是,如果您只需要一个好看的输出,并且companyid中没有太多元素,那么您可能需要编写一个简单的udf,将包转换成一个格式良好的字符串。
java代码

  1. public class BagToString extends EvalFunc<String>
  2. {
  3. @Override
  4. public String exec(Tuple input) throws IOException
  5. {
  6. List<String> strings = new ArrayList<String>();
  7. DataBag bag = (DataBag) input.get(0);
  8. if (bag.size() == 0) {
  9. return null;
  10. }
  11. for (Iterator<Tuple> it = bag.iterator(); it.hasNext();) {
  12. Tuple t = it.next();
  13. strings.add(t.get(0).toString());
  14. }
  15. return StringUtils.join(strings, ":");
  16. }
  17. }

Pig手稿

  1. foo = foreach bar generate memberId, BagToString(companyIds);
展开查看全部
m3eecexj

m3eecexj2#

我知道这有点老了,但我最近遇到了同样的问题。
基于avrostorage文档,使用最新版本的pig和avrostorage,可以直接将包投射到avro阵列。
在您的情况下,您可能需要:

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

其中架构中的数组字段是

  1. {
  2. "name":"companyIds",
  3. "type":[
  4. "null",
  5. {
  6. "type":"array",
  7. "items":"long"
  8. }
  9. ],
  10. "doc":"company ids"
  11. }
展开查看全部

相关问题