我正在尝试编写获取字符串数据的猪脚本:abc | def | xyz并尝试将这些值放入字符串数组中。
如何拆分此字符串以获取像[abc,def,xyz]这样的字符串数组?
我尝试使用STRSPLIT函数,但在我的情况下没有拆分是不固定的。管道分隔值的数量可以变化,我需要所有这些值都在该数组中。
任何建议???
答案 0 :(得分:4)
你是朝着正确的方向前进的,但有一件事abc|def|xyz,1
abc|def|xyz|abc|def|xyz,2
你没有注意到。当分割数量不固定时,您也可以使用它。该UDF的第三个参数是您拥有的“拆分”数量,但您可以传递一个负数,它将查找与您的表达式匹配的所有可能拆分。
来自official documentation for STRSPLIT:
<强>限制强>
如果值为正,则模式(正则表达式的编译表示)最多应用限制1次,因此参数的值表示结果元组的最大长度。结果元组的最后一个元素将包含最后一次匹配后的所有输入。
如果值为负,则不对结果元组的长度应用限制。
想象一下这个输入:
A = load 'data.txt' using PigStorage(',');
B = foreach A generate STRSPLIT($0,'\\|',-1);
您可以执行以下操作:
DUMP B;
((abc,def,xyz))
((abc,def,xyz,abc,def,xyz))
输出将是:
ViewController
答案 1 :(得分:2)
另一个可行的选择是使用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)