1

Pig でタプル/バッグの最後の要素を抽出するにはどうすればよいですか?

Pig のリレーションに文字列ファイルがあります。

この文字列の最後のトークンを新しいフィールドとして抽出したいと考えています。どうすればいいですか?

例:

私たちの関係は

(id:int, description:chararray)

説明フィールドは長い文字列で、この文字列の最後のトークンは、ID を持つ人の姓です。

(123,' here is the description for John Edwards');

私が欲しいのは、この文字列から姓を別のフィールドとして抽出し、次の関係を持つことです

(id:int, lastname:chararray)

すなわち

(1234,'Edwards')
4

2 に答える 2

1

解決策として、入力関係がデータと呼ばれると仮定しましょう

data = LOAD 'data' AS (id:int, description:chararray);

lastName = FOREACH data GENERATE id,REGEX_EXTRACT(description,'\\s([A-Za-z]+)$',1) as lastname:chararray;

これにより、問題の文字列から最後の単語が抽出されます。

于 2013-10-31T19:19:25.403 に答える
0

問題はバッグ内の最後の要素を見つけることに関するものであるため、わずかに異なるデータセットに適用される以下のコードを使用できます。

{"uid":"23423423423","payments":[{"timestamp":"2014-11-12 10:21","payment_id":1,"data":"payment 1 data"},{"timestamp":"2014-12-12 07:20","payment_id":2,"data":"payment 2 data"}]}

Pig スクリプトは次のようになります。

data = LOAD '$INPUT' 
    USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json: map[]);

data = FOREACH data GENERATE 
    json#'uid' as uid:chararray,
    json#'payments' as payments:bag{};

row = FOREACH data {
    item = ORDER payments BY * DESC;
    item = LIMIT item 1;
    item = FOREACH item GENERATE $0 as arr:map[];
    item = FOREACH item GENERATE 
        arr#'timestamp' as timestamp:chararray,
        arr#'payment_id' as payment_id:int,
        arr#'data' as data:chararray;
    GENERATE uid, FLATTEN(item) as (timestamp, payment_id, data);
};

DUMP row;
于 2014-12-21T17:12:33.277 に答える