如何讀取在PIG中以分號分隔的CSV文件? 數據也可以包含分號。如何在PIG中讀取以分號分隔的CSV文件
E.g. 輸入行:「名稱」;「年齡」;「地址」;「簡歷包含特殊字符,如$; ^」;「評級」
輸出:這些字段中的每一個都應加載到列「簡歷」一欄應該有「簡歷包含特殊字符等;,$#$ @ ^」
注:我已經試過PigStorage,CVSLoader但仍然無法使其工作作爲分隔符,也可以是數據。
如何讀取在PIG中以分號分隔的CSV文件? 數據也可以包含分號。如何在PIG中讀取以分號分隔的CSV文件
E.g. 輸入行:「名稱」;「年齡」;「地址」;「簡歷包含特殊字符,如$; ^」;「評級」
輸出:這些字段中的每一個都應加載到列「簡歷」一欄應該有「簡歷包含特殊字符等;,$#$ @ ^」
注:我已經試過PigStorage,CVSLoader但仍然無法使其工作作爲分隔符,也可以是數據。
您可以使用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);
嘗試此解決方案。
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;
如果定界符也存在於輸入數據,那麼我的建議是去爲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
中。