2015-04-21 25 views
0

目的:上的使用字符串函數扁平chararray數據上扁平chararray數據使用字符串函數

輸入:test.txt的

file_id  file_name  created_time   accesssed_by 
    1   a1    1      user1 
    1   a2    2      user1 
    2   b1    3      user1 
    3   c1    4      user1 

豬腳本:

A = LOAD 'usertest.txt' USING PigStorage('\t') AS (file_id:long, file_name:chararray, created_time:long,accessed_by:chararray); 
    B = GROUP A BY file_id; 
    C = FOREACH B { 
    sorted = ORDER A BY created_time DESC; 
    user = A.accessed_by; 
    uniq_user = DISTINCT user; 
    last = LIMIT sorted 1; 
    GENERATE UPPER(FLATTEN(last.file_name)) AS file_name, COUNT(uniq_user) AS access_count; 
}; 

試圖使用任何字符串操作在扁平chararray數據類型之上的函數導致下面的ERROR。

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 185, column 22> mismatched input 'FLATTEN' expecting RIGHT_PAREN 

不使用FLATTEN頂部的字符串操作函數將導致所需的數據。

(a2,1) 
(b1,1) 
(c1,1) 

目的是使用一些字符串處理函數,而不打算對數據進行另一次迭代之前堅持的FILE_NAME轉換爲所需的格式。

如下圖所示,我們可以實現我們的目標,我們能否避免這種情況,並且先做同樣的事情。

D = FOREACH C GENERATE UPPER(file_name) AS file_name, access_count; 

輸出:

(A2,1) 
(B1,1) 
(C1,1) 

更新:

基於@Balduz投入使用BagToString eval函數轉換袋爲String,並能夠達到我們的目的。

C = FOREACH B { 
     sorted = ORDER A BY created_time DESC; 
     user = A.accessed_by; 
     uniq_user = DISTINCT user; 
     last = LIMIT sorted 1; 
     GENERATE UPPER(BagToString(last.file_name)) AS file_name, COUNT(uniq_user) AS access_count; 
     }; 

回答

2

UPPER擷取一個String,但由於file_name包含一個包,當你壓扁它要傳遞的字符串列表的功能,因此錯誤。如果你真的想避免額外的foreach,你需要編寫一個自定義的UDF,它與UPPER完全一樣,但是將一個包作爲輸入。然後,你需要做同樣的你正在做,但呼籲UPPER第一,之後壓扁:

GENERATE FLATTEN(MyUpperForBags(last.file_name)); 
+0

感謝@Balduz,根據您輸入的:使用BagToString eval函數轉換袋爲String,並能夠實現我們的目的。 –