Apache pig 我想把一张地图转换成一个用拉丁字母写的字段

Apache pig 我想把一张地图转换成一个用拉丁字母写的字段,apache-pig,Apache Pig,我的关系(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} 根据

我的关系(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)
... 
(我也想过滤空地图)

有什么想法吗


谢谢。

尽管编写UDF是正确的解决方案,但如果您想使用正则表达式快速解决问题,可能会有所帮助

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

您可以尝试编写一个自定义UDF来提取映射值。类似的回答:我写了我自己的UDF,它工作得很好,谢谢你。+1这将只在加载后工作。