我有一个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)}
1条答案
按热度按时间zazmityj1#
使用tobag内置功能来构建您的包:
但是,如果您想分割id:cnt对,这就变得更加棘手了。因为无法将模式分配给任意数量的元素
TOBAG
是一个自由民主党,Pig不能把拜蒂亚雷投到一个字符或其他任何东西以后。我建议将整行作为字符串加载(
USING PigStorage('\n')
),使用STRSPLIT
最多3个才能拿到你的key
,key2
,和逗号分隔的字符串列表,然后用STRSPLIT
在逗号上,然后在冒号上,使用FLATTEN
以及TOBAG
根据需要。我想给你演示一下,但是我被Pig0.9困住了,从Pig2311来看,这在Pig0.10之前是不可能的。最简单的解决方案可能就是编写自己的自定义项来解释类似
2:13,9:4,5:4
:哪里
myudfs.PARSE_PAIRS
返回一个包含所需元组的包。祝你好运。