2012-08-30 51 views
1

我們旨在利用PIG進行服務器日誌的大規模日誌分析。我需要從一個文件加載一個PIG映射數據類型。PIG加載CSV - 地圖類型錯誤

我試着用下面的數據運行一個示例PIG腳本。

在我的CSV文件中的行,名爲 '測試'(由PIG處理)的樣子,

151364,[ref#R813,highway#secondary] 

我的PIG腳本

a = LOAD 'test' using PigStorage(',') AS (id:INT, m:MAP[]); 
DUMP a; 

的想法是加載一個int和第二個元素作爲散列表。 但是,當我轉儲時,int字段得到正確解析(並在轉儲中打印),但未解析映射字段導致解析錯誤。

有人能解釋一下,如果我錯過了什麼嗎?

回答

1

我認爲有一個分隔符相關的問題(例如字段分隔符在某種程度上影響了地圖字段的解析,或者它與地圖分隔符相混淆)。

當使用該輸入數據(通知我用分號作爲字段分隔符):

151364;[ref#R813,highway#secondary] 
下面

是從我咕嚕殼輸出:

grunt> a = LOAD '/tmp/temp2.txt' using PigStorage(';') AS (id:int, m:[]); 
grunt> dump a; 
... 
(151364,[highway#secondary,ref#R813]) 

grunt> b = foreach a generate m#'ref'; 
grunt> dump b; 
(R813) 
1

Atlast,我想通解決問題。只要將解除限制器從','換成另一個角色,比如管道。字段分隔符被混淆與用於地圖:)

The string 151364,[ref#R813,highway#secondary] was getting parsed into, 
field1: 151364 field2: [ref#R813 field3: highway#secondary] 
Since '[ref#$813' is not a valid map field, there is a parse error. 

我還調查了PigStorage函數的源代碼和確認解析邏輯分隔符「」 - Source code

@Override 
public Tuple getNext() throws IOException { 
     for (int i = 0; i < len; i++) { 
      //skipping some stuff 
      if (buf[i] == fieldDel) { // if we find delim 
       readField(buf, start, i); //extract field from prev delim to current 
       start = i + 1; 
       fieldID++; 
      } 
     } 
} 

因此,由於PIG按分隔符分割字段,因此會導致分析字段與用於映射的分隔符混淆。