2012-10-06 62 views
2

如何用豬處理平面文件?例如,如果你有一行包含一個記錄,其中前四個位置是一年,那麼接下來的5個是產品代碼,最後8個記錄包含MSRP,你如何用Pig查詢這些數據?我可能錯過了一些簡單的東西,但是到目前爲止我發現的一切都需要在使用Pig加載數據時使用分隔符。預先用豬處理平面文件

1999ABCDE12234.00 
2000DCEFS00020.00 
2012FFEWS00005.55 

感謝:

某些樣本數據提供如下。

傑里米

回答

4

一個分裂基於位置的線的方法是使用REGEX_EXTRACT_ALL

E.g:

A = LOAD 'flat.txt' as (line:chararray); 
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, 
     '^(.{1,4})(.{1,5})(.*)$')) AS (year:int, prod_code:chararray, msrp:double); 
dump B; 
(1999,ABCDE,12234.00) 
(2000,DCEFS,00020.00) 
(2012,FFEWS,00005.55) 
+0

我假設這種方法效率不高,而且我希望將它與分隔符一起存儲以供將來處理,那是對的嗎? – jwmajors81

+0

你可以肯定地調整這個正則表達式,但是如果你有可能用分隔符存儲數據,那麼確實比處理複雜正則表達式更有效 –

1

也有一個內置的字符串函數,

A = LOAD 'flat.txt' as (line:chararray); 

B = FOREACH A GENERATE SUBSTRING(line,0,3),SUBSTRING(line,4,8),SUBSTRING(line,9,16); 

dump B; 
0

兩個以前的答案是偉大的。另外,如果輸入字符串很複雜或需要條件解析,則可以實現自己的UDF