我的关系元组(A)的描述如下: {a:int,b:int,c:map []} 地图只包含一个字符,但密钥不可预测。例如,我的元组样本是:
(1, 100, [key.152#hello])
(8, 110, [key.3000#bonjour])
(5, 103, [key.1#hallo])
(5, 103, [])
(8, 104, [key.11#buenosdias])
...
我想将我的关系(A)转换为B关系,因此B描述将是: {a:int,b:int,c:chararray}
使用我的样本,它会给出:
(1, 100, hello)
(8, 110, bonjour)
(5, 103, hallo)
(8, 104, buenosdias)
...
(我也希望过滤空地图)
有什么想法吗?
谢谢。
答案 0 :(得分:2)
虽然编写UDF是正确的解决方案,但是如果你想使用Regex快速解决一些问题可能会有所帮助。
A = LOAD 'sample.txt' as (a:int, b:int, c:chararray);
B = FOREACH A GENERATE a, b, FLATTEN(STRSPLIT(c, '#', 2)) as (key:chararray, value:chararray);
C = FOREACH B GENERATE a, b, FLATTEN(STRSPLIT(value, ']', 2)) as (value:chararray, ignore:chararray);
D = FILTER C BY value is not null;
E = FOREACH D GENERATE a, b, value;
STORE E INTO 'output/E';
对于样本输入
1 100 [key.152#hello]
8 110 [key.3000#bonjour]
5 103 [key.1#hallo]
5 103 []
8 104 [key.11#buenosdias]
上面的代码产生以下输出:
1 100 hello
8 110 bonjour
5 103 hallo
8 104 buenosdias