1

私は、生のトランザクションでヘビーデューティーデータ処理を実行し、さまざまなトランザクションパターンを考え出すPIGスクリプトに取り組んでいます。

パターンの1つを言うと、1日に国境を越えたトランザクションを受け取ったすべてのアカウントを検索します(トランザクションの合計とトランザクションの量を含む)。

私の期待する出力は2つのデータファイルであるはずです。1)ロールアップデータ-アカウントA1がオーストラリア国から50件のトランザクションを受け取ったように。2)生のトランザクション-A1の50を超えるすべてのトランザクション。

私のPIGスクリプトは現在、次の形式で出力データソースを作成しています

アカウント国TotalTxnsRawTransactions

A1 AU 50 [(Txn1)、(Txn2)、(Txn3)....(Txn50)]

A2 JP 30 [(Txn1)、(Txn2)....(Txn30)]

ここでの質問は、このデータをHadoopシステムから(一部のDBに)取得するときに、ロールアップレコード(A1、AU、50)と50個の生のトランザクションすべて(外部として使用されるロールアップレコードのID 1など)との間にリンクを確立したいということです。関連する50のTxnsすべてのキー)。

配布されているHadoopをIDの割り当てに使用するべきではないことは理解していますが、一意でないID(順次である必要はありません)またはこのデータをリンクする他の方法を割り当てることができるオプションはありますか?

EDIT(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;

これを実行した後、私は得ています

エラーorg.apache.pig.tools.pigstats.SimplePigStats-エラー2997:バックエラーから例外を再作成できません:datafu.pig.bags.Enumerate.enumerateBag(Enumerate.java:89)のjava.lang.NullPointerExceptionがdatafu.pigにあります.bags.Enumerate.accumulate(Enumerate.java:104)...。

4

4 に答える 4

0

あなたの列の中でユニークなものは何ですか?アカウントIDと国コードはPigスクリプトでグループ化したもののようです。では、それらを使用して複合キーを作成してみませんか?何かのようなもの

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

もちろん、これをよりエレガントにするためにUDFを作成することもできます。数値IDが必要な場合は、上記のように文字列を作成するUDFを記述してから、そのhashCode()メソッドを呼び出してみてください。もちろん、これは一意性を保証するものではありませんが、あなたはそれで大丈夫だと言いました。文字列を一意の整数に変換する独自のメソッドをいつでも構築できます。

しかし、それでも、なぜ単一のIDキーが必要なのですか?後で2つのテーブルのフィールドを結合する場合は、一度に複数のフィールドに結合できます。

于 2013-01-24T22:09:48.313 に答える
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

于 2013-01-24T22:27:37.373 に答える
0

IDが数字であり、UUIDまたはその他の文字列ベースのIDを使用できない場合。LinkedInによるUDFのDataFuライブラリ(DataFu)があり、非常に便利なUDFEnumerateがあります。したがって、できることは、すべてのレコードを1つのバッグにグループ化し、そのバッグをEnumerateに渡すことです。これが私の頭のてっぺんからのコードです:

register jar with UDF with Enumerate UDF
inpt = load '....' ....;
allGrp = group inpt all;
withIds = foreach allGrp generate flatten(Enumerate(inpt));
于 2013-01-25T00:12:19.040 に答える
0

DataFuには0.0.9で修正された列挙のバグがあったため、0.0.9以降を使用してください。

于 2013-07-03T05:19:21.570 に答える