用piglatin加载csv

q8l4jmvw  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(298)

我有一个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)}

zazmityj

zazmityj1#

使用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 是一个自由民主党,Pig不能把拜蒂亚雷投到一个字符或其他任何东西以后。
我建议将整行作为字符串加载( USING PigStorage('\n') ),使用 STRSPLIT 最多3个才能拿到你的 key , key2 ,和逗号分隔的字符串列表,然后用 STRSPLIT 在逗号上,然后在冒号上,使用 FLATTEN 以及 TOBAG 根据需要。我想给你演示一下,但是我被Pig0.9困住了,从Pig2311来看,这在Pig0.10之前是不可能的。
最简单的解决方案可能就是编写自己的自定义项来解释类似 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 返回一个包含所需元组的包。祝你好运。

相关问题