【问题标题】:How to split string data to array using pipe delimiter in pig?如何使用pig中的管道分隔符将字符串数据拆分为数组?
【发布时间】:2015-08-21 03:12:36
【问题描述】:

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

我如何拆分这个字符串以获得一个字符串数组,如 [abc,def,xyz] ?

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

有什么建议吗???

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    您的方向是正确的,但是您没有注意到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))
    

    【讨论】:

    • 我还有 1 个问题...我得到的响应是 STRUCT 类型,但我想将此数据存储在配置单元表中的 ARRAY 类型变量中...这会导致类型不匹配...对此有任何解决方案吗???
    【解决方案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)
    

    【讨论】:

    • 谢谢 Murali ... Balduz 给出的答案是有效的,但我得到的响应是 STRUCT 类型,我想将它存储在一个配置单元表中的 ARRAY...这导致类型不匹配...对此有任何解决方案吗???
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2013-02-19
    • 2019-03-15
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多