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 没有完全解析元组的主要内容,如果未能解决你的问题,请参考以下文章

apache pig Java UDF - 更改属性中的值似乎并没有坚持

使用 pig,如何将混合格式的行解析为元组和一袋元组?

将键值元组包转换为 Apache Pig 中的映射

在 Apache Pig 中为元组创建模式

如何规范化 apache pig 中的地图元组?

如何检查元组是不是包含 Apache Pig 中的元素?