2013-01-24 70 views
1

我正在研究對原始事務執行重型數據處理並提出各種事務模式的PIG腳本。爲Hadoop/PIG輸出數據分配ID

說一種模式是 - 查找一天中接收到跨境交易的所有賬戶(包括總交易量和交易金額)。

我的預期輸出應該是兩個數據文件 1)彙總數據 - 與賬戶A1類似,從AU國家收到50筆交易。 2)原始交易 - A1以上的所有交易超過50筆。

我的腳本PIG當前在以下格式創建輸出數據源

帳戶國家TotalTxns RawTransactions

A1 AU 50 [(TXN1),(Txn2),(Txn3)....(Txn50) ]

A2 JP 30(TXN1),(Txn2)......(Txn30)

是現在的問題在這裏,當我得到這個數據從Hadoop的系統(在一定DB)我想在我的彙總記錄(A1,AU,50)與所有50個原始交易(例如r用作所有50個關聯的Txns的外鍵的ollup記錄)。

我知道被分配的Hadoop不應該用於分配ID,但是在那裏我可以分配非唯一ID(不需要按順序)或其他方式來鏈接這些數據嗎?

編輯(使用枚舉從DataFu後) 這裏是PIG腳本

register /UDF/datafu-0.0.8.jar 
define Enumerate datafu.pig.bags.Enumerate('1'); 
data_txn = LOAD './txndata' USING PigStorage(',') AS (txnid:int, sndr_acct:int,sndr_cntry:chararray, rcvr_acct:int, rcvr_cntry:chararray); 
data_txn1 = GROUP data_txn ALL; 
data_txn2 = FOREACH data_txn1 GENERATE flatten(Enumerate(data_txn)); 
dump data_txn2; 

運行此之後,我得到

ERROR org.apache.pig.tools.pigstats.SimplePigStats - 錯誤2997:無法重新創建從後備錯誤異常:java.lang.NullPointerException at datafu.pig.bags.Enumerate.enumerateBag(Enumerate.java:89) at datafu.pig.bags.Enumerate.accumulate(Enumerate.java :104) ....

+0

如果UUID不是一個選項,你的數據庫模式使用數字作爲ID,你可以編寫一個UDF來完成http://stackoverflow.com/questions/11737750/how-to-handle-id-generation- on-a-hadoop-cluster/11748679#11748679。 – alexeipab

回答

0

我經常在Hadoop作業中分配隨機ID。您只需確保生成包含足夠數量的隨機比特的ID以確保碰撞的可能性足夠小(http://en.wikipedia.org/wiki/Birthday_problem)。根據經驗,我使用3 * log(n)個隨機比特,其中n =需要生成的id的數量。

在很多情況下,Java的UUID.randomUUID()就足夠了。

http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

+0

最後,在嘗試各種選項後,我使用Java UUID創建了UDF,它對我有用 - 謝謝 – Rushik

0

行中的獨特之處是什麼?看起來,帳戶ID和國家代碼是您在Pig腳本中分組的內容,那麼爲什麼不使用這些密鑰來創建組合鍵呢?像

CONCAT(CONCAT(account, '-'), country) 

當然,你可以寫一個UDF,使這更優雅。如果您需要數字ID,請嘗試編寫一個UDF,它將創建上述字符串,然後調用其方法hashCode()。這當然不能保證唯一性,但是你說這是對的。您始終可以構建自己的將字符串轉換爲唯一整數的方法。

但這就是說,爲什麼你需要一個ID密鑰?如果您希望稍後加入兩個表格的字段,則可以一次加入多個字段。

+0

感謝您的回覆,我不能假設帳戶+國家是獨一無二的(可能將來我可以添加其他場景,我可以爲同一帳戶+國家/地區組合獲得不同彙總,並且因爲相同原因,我無法在帳戶+國家/地區加入表格原始交易),我正在嘗試下面由alexeipab建議的DataFu庫。 – Rushik

0

如果當你的ID是數字,你不能使用UUID或其他基於字符串的標識。 由LinkedIn提供的UDF的DataFu庫(DataFu)和一個非常有用的UDF Enumerate。因此,您可以將所有記錄分組放入包中,並將包傳遞給枚舉。下面是從我的頭頂代碼:

register jar with UDF with Enumerate UDF 
inpt = load '....' ....; 
allGrp = group inpt all; 
withIds = foreach allGrp generate flatten(Enumerate(inpt)); 
+0

謝謝alexeipab,我正在嘗試這個用於我的用例。會在某個時候讓你知道。 – Rushik

+0

@alexepiab - 不確定,但我得到NullPointerException在我的PIG腳本,添加我的實際PIG腳本上面的問題 – Rushik

+0

這枚枚舉udf是錯誤的。 i和count變量未被初始化,導致空指針異常。我結束了使用我自己稍微修改的版本:https://github.com/Data2Semantics/d2s4pig –

0

DataFu曾在枚舉一個bug,其固定在0.0.9,所以使用0.0.9或更高版本。