2012-01-12 47 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. 通過索引獲取值

我知道這是哈克。只是想提供另一種做法