2012-01-12 35 views
1

我有一个名为data文件看起来像这样:Apache的猪不能解析的元组完全

personA (1, 2, 3) 
personB (2, 1, 34) 

(注意,是“PERSONA”之后的制表),我有这样一个Apache猪脚本:

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将输入元组解析为一个元组而不必写出完整的模式?

回答

4

猪不接受你传递的有效信息。默认加载方案PigStorage只接受分隔文件(默认情况下制表符分隔)。使用括号和文本中的逗号解析元组结构并不够智能。您的选项是:

  • 重新格式化您的文件进行制表符分隔:personA 1 2 3
  • 通过符合TextLoader阅读行的文件,然后写某种UDF它解析线和形式返回数据,您想。
  • 写自己的custom loader
0

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

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

输出我得到的是:

(1) 
(2) 
0

这是解决这个问题的另一种方式,虽然我知道上述问题的答案是更有效的。

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作为chararray
  2. 删除括号
  3. 斯普利特用逗号FIELD2(它给你一个元组在这3场)
  4. 通过索引获取值

我知道这是哈克。只是想提供另一种做法