2015-06-22 40 views
0

應用哈希這是有兩個部分一個問題:返回從蟒蛇UDF未知長度的元組,然後在豬

首先,我有一個創建未知長度的字符串列表蟒蛇UDF。 UDF的輸入是map(python中的dict),密鑰的數量基本上是未知的(這是我試圖獲得的)。

我不知道的是如何在一個模式中輸出它,讓我將它作爲列表(或其他可迭代的數據結構)返回。這是我到目前爲止:

@outputSchema("?????") #WHAT SHOULD THE SCHEMA BE!?!? 
def test_func(input): 

    output = [] 
    for k, v in input.items(): 

     output.append(str(key)) 

    return output 

現在,問題的第二部分。一旦進入Pig,我希望爲我的所有用戶應用SHA散列到「列表」中的每個元素。有些豬僞代碼:因爲我想給SHA應用到每個元素在列表中,而不是整個列表

USERS = LOAD 'something' as (my_map:map[chararray]) 
UDF_OUT = FOREACH USERS GENERATE my_udfs.test_func(segment_map) 
SHA_OUT = FOREACH UDF_OUT GENERATE SHA(UDF_OUT) 

最後一行可能是錯誤的。

回答

1

要回答你的問題,因爲你是返回一個Python列表誰的內容是一個字符串,你會想你的裝飾器是

@outputSchema('name_of_bag:{(keys:chararray)}') 

指定此結構時,它會引起混亂,因爲你只需要定義包裏有什麼一個元素看起來像。

這就是說,有一種更簡單的方法來做你所需要的。有一個函數KEYSET()You can reference this question I answered),它將從Pig Map中提取密鑰。因此,使用的數據來自例如設置和增加了更多的鍵第一個,因爲你說你的地圖內容的長度是可變

maps 
---- 
[a#1,b#2,c#3,d#4,e#5] 
[green#sam,eggs#I,ham#am] 

查詢

REGISTER /path/to/jar/datafu-1.2.0.jar; 
DEFINE datafu.pig.hash.SHA(); 

A = LOAD 'data' AS (M:[]); 
B = FOREACH A GENERATE FLATTEN(KEYSET(M)); 
hashed = FOREACH B GENERATE $0, SHA($0); 
DUMP hashed; 

輸出

(d,18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4) 
(e,3f79bb7b435b05321651daefd374cdc681dc06faa65e374e38337b88ca046dea) 
(b,3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d) 
(c,2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6) 
(a,ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb) 
(ham,eccfe263668d171bd19b7d491c3ef5c43559e6d3acf697ef37596181c6fdf4c) 
(eggs,46da674b5b0987431bdb496e4982fadcd400abac99e7a977b43f216a98127721) 
(green,ba4788b226aa8dc2e6dc74248bb9f618cfa8c959e0c26c147be48f6839a0b088)