【发布时间】:2015-08-21 03:12:36
【问题描述】:
我正在尝试编写获取字符串数据的猪脚本,如下所示:abc|def|xyz 并尝试将这些值放入字符串数组中。
我如何拆分这个字符串以获得一个字符串数组,如 [abc,def,xyz] ?
我尝试使用 STRSPLIT 函数,但在我的情况下拆分的数量不固定。管道分隔值的数量可能会有所不同,我需要所有这些值都在该数组中。
有什么建议吗???
【问题讨论】:
标签: apache-pig
我正在尝试编写获取字符串数据的猪脚本,如下所示:abc|def|xyz 并尝试将这些值放入字符串数组中。
我如何拆分这个字符串以获得一个字符串数组,如 [abc,def,xyz] ?
我尝试使用 STRSPLIT 函数,但在我的情况下拆分的数量不固定。管道分隔值的数量可能会有所不同,我需要所有这些值都在该数组中。
有什么建议吗???
【问题讨论】:
标签: apache-pig
您的方向是正确的,但是您没有注意到STRSPLIT 的一件事。您也可以在拆分数量不固定时使用它。该 UDF 的第三个参数是您拥有的“拆分”数量,但您可以传递一个负数,它会查找与您的表达式匹配的所有可能拆分。
来自official documentation for STRSPLIT:
限制
如果值为正,则模式(正则表达式的编译表示)最多应用 limit-1 次,因此参数的值表示结果元组的最大长度。结果元组的最后一个元素将包含最后一次匹配之后的所有输入。
如果值为负数,则对结果元组的长度没有限制。
想象一下这个输入:
abc|def|xyz,1
abc|def|xyz|abc|def|xyz,2
您可以执行以下操作:
A = load 'data.txt' using PigStorage(',');
B = foreach A generate STRSPLIT($0,'\\|',-1);
输出将是:
DUMP B;
((abc,def,xyz))
((abc,def,xyz,abc,def,xyz))
【讨论】:
另一个可行的选择是使用 TOKENIZE。建议采用@Balduz 建议的解决方案。
A = load 'data.txt' using PigStorage(',');
B = foreach A generate BagToString(TOKENIZE($0,'|'),',');
DUMP B;
输出:DUMP B:
(abc,def,xyz)
(abc,def,xyz,abc,def,xyz)
【讨论】: