我有一个格式如下的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)}
答案 0 :(得分: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无法将字节数组转换为字符串或其他任何内容。
我建议将整行作为字符串(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);
其中myudfs.PARSE_PAIRS
返回包含所需元组的包。祝你好运。