如何使用管道中的管道分隔符将字符串数据拆分为数组?

时间:2015-07-22 09:06:35

标签: apache-pig

我正在尝试编写获取字符串数据的猪脚本:abc | def | xyz并尝试将这些值放入字符串数组中。

如何拆分此字符串以获取像[abc,def,xyz]这样的字符串数组?

我尝试使用STRSPLIT函数,但在我的情况下没有拆分是不固定的。管道分隔值的数量可以变化,我需要所有这些值都在该数组中。

任何建议???

2 个答案:

答案 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)
相关问题