0

私は3つのデータ型を持っています...

1) ベースデータ 2) data_dict_1 3) data_dict_2

ベース データは非常に適切にフォーマットされた json です。次に例を示します。

{"id1":"foo", "id2":"bar" ,type:"type1"}
{"id1":"foo", "id2":"bar" ,type:"type2"}

data_dict_1

1 foo
2 bar
3 foobar
....

data_dict_2

-1 foo
-2 bar
-3 foobar
... and so on

今、私が欲しいのは..データがtype1の場合

次に、data_dict_1 から id1 を読み取り、data_dict2 から id2 を読み取り、その整数 id を割り当てます。データが type2 の場合、data_dict_2 から id1 を読み取ります。

{"id1":1, "id2":2 ,type:"type1"}
{"id1":-1, "id2":-2 ,type:"type2"}

などなど..豚でこれを行うにはどうすればよいですか?

4

1 に答える 1

1

注:上の例にあるもの有効なjsonでtypeはありません。キーは引用されていません。

Pig 0.10 以降を想定すると、組み込みのJsonLoaderがあり、これにスキーマを渡してロードできます。

data = LOAD 'loljson' USING JsonLoader('id1:chararray,id2:chararray,type:chararray');

そして辞書をロードします

dict_1 = LOAD 'data_dict_1' USING PigStorage(' ') AS (id:int, key:chararray);
dict_2 = LOAD 'data_dict_2' USING PigStorage(' ') AS (id:int, key:chararray);

type次に、値に基づいてそれを分割します

SPLIT data INTO type1 IF type == 'type1', type2 IF type == 'type2';

JOINそれらを適切に

type1_joined = JOIN type1 BY id1, dict_1 BY key;
type1_joined = FOREACH type1_joined GENERATE type1::id1 AS id1, type1::id2 AS id2, type1::type AS type, dict_1::id AS id;

type2_joined = JOIN type2 BY id2, dict_2 BY key;
type2_joined = FOREACH type2_joined GENERATE type2::id1 AS id1, type2::id2 AS id2, type2::type AS type, dict_2::id AS id;

スキーマが等しいため、UNIONそれらを一緒に

final_data = UNION type1_joined, type2_joined;

これが生み出す

DUMP final_data;

(foo,bar,type2,-2)
(foo,bar,type1,1)
于 2013-10-22T20:52:11.177 に答える