我有一个名为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 ;
- 将字段2加载为字符数组
- 删除括号
- 用逗号拆分字段2(它为您提供了一个包含3个字段的元组)
- 按索引获取值
我知道这很烦人。只是想提供另一种实现的方法