TOBAG 組み込み関数を使用して、バッグを作成します。
$ cat input
TRAABRX12903CC4816,1548880,2:19,4:7
TRAABRX12903CC4816,1548881,2:19,4:7,5:23,7:3
TRAABRX12903CC4816,1548882
TRAABRX12903CC4816,1548883,17:33
$ cat test.pig
data = LOAD 'input' USING PigStorage(',');
data0 = FOREACH data GENERATE $0 AS key:chararray, $1 AS key2:chararray, TOBAG($2 ..) AS bow:{(pair)};
DESCRIBE data0;
DUMP data0;
$ pig -x local test.pig
...
data0: {key: chararray,key2: chararray,bow: {(pair: NULL)}}
...
(TRAABRX12903CC4816,1548880,{(2:19),(4:7)})
(TRAABRX12903CC4816,1548881,{(2:19),(4:7),(5:23),(7:3)})
(TRAABRX12903CC4816,1548882,{})
(TRAABRX12903CC4816,1548883,{(17:33)})
ただし、id:cnt のペアを分割したい場合、これはより複雑になります。スキーマを任意の数の要素に割り当てる方法はなくTOBAG
、UDF であるため、Pig は bytearray を後で chararray などにキャストできません。
行全体を文字列 ( USING PigStorage('\n')
)としてロードSTRSPLIT
し、制限 3 を使用してkey
, key2
, およびカンマ区切りの文字列リストSTRSPLIT
を取得し、次にカンマで、次にコロンで反復して、必要なペアを取得し、 と を使用することをお勧めしますFLATTEN
。TOBAG
必要に応じて。これをデモンストレーションしますが、私は Pig 0.9 で立ち往生しており、PIG-2311から判断すると、これは Pig 0.10 までは不可能です。
最も簡単な解決策は、次のような文字列を解釈する独自の UDF を作成することです2:13,9:4,5:4
。
data = LOAD 'input' USING PigStorage('\n') AS (line:chararray);
data0 = FOREACH data GENERATE FLATTEN(STRSPLIT(line, ',', 3)) AS (key:chararray, key2:chararray, pairs:chararray);
data1 = FOREACH data0 GENERATE key, key2, myudfs.PARSE_PAIRS(pairs);
wheremyudfs.PARSE_PAIRS
は、必要なタプルを含むバッグを返します。幸運を。