0

次の形式のcsvファイルがあります

TRAABRX12903CC4816,1548880,2:19,4:7,...
.
.
.

私の問題は、次のように解釈したいということです

{(key:chararray,key2:int,{(id:int,cnt:int)})}

これまでのところ、私のコードは

data = LOAD 'mxm_dataset_test_3.txt' using PigStorage(',');
data0 = foreach data generate $0 as key:chararray, {$2 ..} as bow;

このdata0ため、スキーマdata0: {key: chararray,bow: {(NULL)}} を明示的にキャストしようとする(bag{tuple(chararray)})

data0 = foreach data generate $0 as key:chararray, {$2 ..} as bow;

これによりエラーが発生しますCannot cast bag with schema :bag{:tuple(:NULL)} to bag with schema :bag{:tuple(:chararray)}

4

1 に答える 1

0

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を取得し、次にカンマで、次にコロンで反復して、必要なペアを取得し、 と を使用することをお勧めしますFLATTENTOBAG必要に応じて。これをデモンストレーションしますが、私は 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は、必要なタプルを含むバッグを返します。幸運を。

于 2012-12-13T16:24:05.853 に答える