2011-09-14 85 views
1

我有一些數據日誌行像有多個分隔符

Sep 10 12:00:01 10.100.2.28 t: |US,en,5,7350,100,0.076241,0.105342,-1,0,1,5,2,14,,,0,5134,7f378ecef7,fec81ebe-468a-4ac7-b472-8bd1ee88bfc2 

Sep 10 12:00:01 10.100.2.28 t: |US,en,3,22427,100,0.05816,0.04018,-1,0,1,15,15,0,24383,cyclops.untd.com/,0,2796,2c5de71073,4858b748-121a-4f60-8087-97a8527d57c6 

Sep 10 12:00:01 10.100.2.28 t: |us,en,6,16839,100,-1,-1,-1,17,1,0,-1,0,13819,d.tradex.openx.com/,0,-1,,4f805e3b-86b7-4dee-ae68-24e726cde954 

豬負載問題沒有,因爲它是明顯的有兩個分隔符(逗號和空格)。雖然使用PigStorage功能,我想我只能使用其中的一個....這使我與另一個分隔符(空格或逗號)的另一個字符串chararray。

我想訪問該chararray的每個成員,但不能這樣做。我也曾嘗試記號化,但是,讓一個袋子,我不認爲在一個袋子裏的物品排序,從而可以單獨訪問...

僧侶任何幫助,將不勝感激......

Tanuj

回答

2

您可以編寫自己的自定義user-defined load function,以任何您想要的方式處理加載。通常,如果你的格式是某種奇怪的自定義格式,那麼你將會被卡住。您還可以獲得自定義加載器自動命名列的好功能。

您的其他選擇是在您的數據進入Pig之前對其進行預處理,以便很好地進行分隔。我不確定你的數據是如何設置的或者它是如何進入的,所以我不確定這是否可行。一般來說,一點數據修飾和消毒不會是一件壞事。

+0

偶然發現了這個莫名其妙的最佳方式 - 有實際上是一個相當可行的第三個選項,而不是實現一個整體,全面的'LOAD' UDF,人們可以使用流媒體。基本上,通過一個簡單的[在這裏插入fav lang]腳本或者只是簡單的* nix命令來加載所有的東西作爲行和流。這個特殊的例子可以很容易地通過流'tr',''\ t''和使用正確的模式來解決。 – TC1

1

我能想到的最簡單的解決方案是使用內置PigStorage加載器作爲兩個分隔符之一,然後使用STRSPLIT來獲得另一個分隔符。

實例(假設有19個逗號分隔的字段,因爲這就是它看起來像):

A = LOAD 'myData' USING PigStorage(' ') AS 
    (date:chararray,restOfCommaDelimitedFields:chararray); 
B = FOREACH A GENERATE date, FLATTEN(STRSPLIT(restOfCommaDelimitedFields,19)) AS 
    (country,language,field3,field4...etc); 

注意是否有任何的逗號分隔的字段之間的空間,這將打破。

0

編寫您自己的UDF,它會爲您解決問題