2015-04-06 116 views
0

如何讀取在PIG中以分號分隔的CSV文件? 數據也可以包含分號。如何在PIG中讀取以分號分隔的CSV文件

E.g. 輸入行:「名稱」;「年齡」;「地址」;「簡歷包含特殊字符,如$; ^」;「評級」

輸出:這些字段中的每一個都應加載到列「簡歷」一欄應該有「簡歷包含特殊字符等;,$#$ @ ^」


注:我已經試過PigStorage,CVSLoader但仍然無法使其工作作爲分隔符,也可以是數據。

回答

0

您可以使用piggybank.jar來讀取這些文件。

首先,您需要在豬腳本中註冊piggybank.jar,然後您可以在腳本中使用這些函數。以下是代碼片段(我沒有測試過這一點,但我敢肯定它會做的伎倆)

REGISTER 'piggybank-0.12.0.jar'; 

DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage(); 

input_lines = LOAD 'PATH/TO/FILES' using CSVExcelStorage(';', 'YES_MULTILINE') AS (name:chararray, age:int, address:chararray, details:chararray); 

欲瞭解更多詳情,請參閱thisthis

0

嘗試此解決方案。

A = load 'pigconcat' using PigStorage(';') as (a:chararray,b:chararray,c:chararray,d:chararray,e:chararray,f:chararray); 

B = foreach A GENERATE a,b,c,CONCAT(CONCAT(d,';'),e) as (resume:chararray),f; 

C= foreach B GENERATE resume; 

dump C; 
0

如果定界符也存在於輸入數據,那麼我的建議是去爲Regex,而不是任何加載技術(PigStorage,CSVStorage)。這將爲您的輸入提供更多的靈活性和控制力。我同意許多人因爲複雜的本質而不會去Regex,但這些問題可以使用正則表達式輕鬆解決。

樣品例如

輸入

"Name";"Age";"Address";"Resume contains special char like ;,$#[email protected]^";"Rating" 
"Name1";"Age1";"Address1";"Resume;$# contains ;@^ special char like ;,$#[email protected]^";"Rating" 

PigScript:

A = LOAD 'input' AS (line:chararray); 
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'("\\w+");("\\w+");("\\w+");("[\\w+\\s;$,#@^]+");("\\w+")')) AS(name,age,address,resume,rating); 
C = FOREACH B GENERATE resume; 
DUMP C; 

輸出:

("Resume contains special char like ;,$#[email protected]^") 
("Resume;$# contains ;@^ special char like ;,$#[email protected]^") 

注:
這是非常通用的解決方案,也將努力無論任何數量的本特殊字符在輸入column(resume)。在這個腳本中,我只打印了resume column,如果您需要其他列,請將其包含在relation C中。

相關問題