Apache Pig 没有完全解析元组
Posted
技术标签:
【中文标题】Apache Pig 没有完全解析元组【英文标题】:Apache Pig not parsing a tuple fully 【发布时间】:2012-01-12 16:18:47 【问题描述】:我有一个名为 data
的文件,如下所示:(注意“personA”后面有标签)
personA (1, 2, 3)
personB (2, 1, 34)
我有一个这样的 Apache pig 脚本:
A = LOAD 'data' AS (name: chararray, nodes: tuple(a:int, b:int, c:int));
C = foreach A generate nodes.$0;
dump C;
它的输出是有意义的:
(1)
(2)
但是,如果我将脚本的架构更改为这样:
A = LOAD 'data' AS (name: chararray, nodes: tuple());
C = foreach A generate nodes.$0;
dump C;
那么我得到的输出是这样的:
(1, 2, 3)
(2, 1, 34)
看起来这个元组中的第一个(也是唯一一个)元素是一个字节数组。即它没有将输入文本 1, 2, 3
解析为元组。
将来我的输入将在nodes
项中包含未知且可变数量的元素,所以我不能只写出a:int, …
。
有没有办法让 Pig 将输入元组解析为一个元组,而不必写出完整的模式?
【问题讨论】:
【参考方案1】:Pig 不接受您传入的内容是有效的。默认加载方案 PigStorage 仅接受分隔文件(默认为制表符分隔)。用文本中的括号和逗号解析元组结构是不够聪明的。您的选择是:
将文件重新格式化为制表符分隔:personA 1 2 3
使用TextLoader
逐行读取文件,然后编写某种UDF 来解析该行并以您想要的形式返回数据。
写你自己的custom loader。
【讨论】:
【参考方案2】:这不再是一个限制。 Pig 解析输入文件中的元组,考虑逗号作为字段分隔符。我正在尝试使用 Apache Pig 版本 0.15.0。
A = LOAD 'data' AS (name: chararray, nodes: tuple());
C = foreach A generate nodes.$0;
dump C;
我得到的输出是:
(1)
(2)
【讨论】:
【参考方案3】:这是解决此问题的另一种方法,尽管我知道上面的答案更有效。
data = LOAD 'data' USING PigStorage() AS (name:chararray, field2:chararray);
data = FOREACH data GENERATE name, REPLACE(REPLACE(field2, '\\(',''),'\\)','') AS field2;
data = FOREACH data GENERATE name, STRSPLIT(field2, '\\,') AS fieldTuple;
data = FOREACH data GENERATE name, fieldTuple.$0,fieldTuple.$1, fieldTuple.$2 ;
-
将 field2 加载为 chararray
删除括号
用逗号分割 field2(它会为您提供一个包含 3 个字段的元组)
按索引获取值
我知道这很老套。只是想提供另一种方法
【讨论】:
以上是关于Apache Pig 没有完全解析元组的主要内容,如果未能解决你的问题,请参考以下文章