2016-10-09 168 views
0

我已經採取了一些從CSV使用豬腳本列的列替換任何種類的換行符:豬腳本從

Cleaned = FOREACH data generate $0 .. $8,$11 .. $27, $31 .. $41, $45 .. $97, $99 .. $111; 

在,我不停的專欄中,我想請個假任何可能會破壞蜂巢中數據的新行字符。是它\n\r\r\n<br>。由於它是用戶輸入的數據,我相信使用回車鍵輸入數據時創建的換行符將成爲上述字符之一,如果您也可以指定它轉換的內容,但是大部分我需要做確保任何類型的換行都從數據中取出,以確保我的數據通過hive CSV解析器正確映射。我如何在我用來過濾列的豬腳本中執行此操作?

編輯:1.我希望繼續使用列範圍,而不必指定每列。 2.指向的示例不處理所有類型的新行字符。

+0

[豬 - 刪除換行,返回和標籤]的可能的複製(http://stackoverflow.com/questions/36212024/pig-remove-line-feed-return-and-tab) –

+0

'乙= REPEED REPLACE(REPLACE(id,'\ n',''),',','')AS id,REPLACE(REPLACE(date,'\ n',''),',','' )AS date,REPLACE(REPLACE(text,'\ n',''),',','')AS text;'這只是一個你可以調整的例子http://stackoverflow.com/questions/31394130/ pig-remove-embedded-newlines-and-commas-in-gzip-files –

+0

@ Hack-R:我在這個例子中使用了cam。我在這裏指定了列範圍。我如何整合列範圍? – gags

回答

2

既然你有大量的列數,你最好在加載數據作爲line:chararray,然後使用REPLACE function.Once數據清洗,你可以使用STRSPLIT到行拆分成多列,然後使用範圍以獲取所需的列。

A = LOAD 'data.csv' AS (line:chararray); 
B = FOREACH A GENERATE REPLACE(REPLACE(REPLACE(REPLACE(line,'\\n',''),'\\r',''),'\\r\\n',''),'<br>',''); 
C = FOREACH B GENERATE FLATTEN(STRSPLIT($0,',')); 
D = FOREACH C GENERATE $0 .. $8,$11 .. $27, $31 .. $41, $45 .. $97, $99 .. $111; 
DUMP D; 
+0

我們可以使用replace(line,'(\ n | \ t)','' )替代使用多個replace()函數? – Shekhar

+1

@Shekhar號REPLACE語法是REPLACE(字符串,'oldChar','newChar');除非新版本的Pig具有,否則不能在單個替換中使用正則表達式或替換多個字符。這種能力。最好的方法是自己測試一下。 –