Apache Pig未完全解析元组



我有一个名为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)

看起来这个元组中的第一个(也是唯一一个)元素是字节数组。即它没有将输入文本CCD_ 2解析为元组。

在未来,我的输入将有一个未知的&nodes项中元素的数量可变,所以我不能只写出a:int, …

有没有办法让Pig将输入元组解析为元组,而不必写出完整的模式?

Pig不接受您传递的有效内容。默认加载方案PigStorage只接受分隔的文件(默认情况下以制表符分隔)。用文本中的括号和逗号来解析元组结构是不够明智的。您的选择是:

  • 将文件重新格式化为制表符分隔:personA 1 2 3
  • 使用TextLoader逐行读取文件,然后编写某种UDF,解析该行并以所需的形式返回数据
  • 编写自己的自定义加载程序

这不再是一个限制。Pig将逗号作为字段分隔符来解析输入文件中的元组。我正在尝试Apache Pig 0.15.0版本。

A = LOAD 'data' AS (name: chararray, nodes: tuple());
C = foreach A generate nodes.$0;
dump C;

我得到的输出是:

(1)
(2)

这里有另一种解决这个问题的方法,尽管我知道上面的答案更有效。

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 ;
  1. 将字段2加载为字符数组
  2. 删除括号
  3. 用逗号拆分字段2(它为您提供了一个包含3个字段的元组)
  4. 按索引获取值

我知道这很烦人。只是想提供另一种实现的方法

相关内容

  • 没有找到相关文章

最新更新