【问题标题】:indexOf alike function in HIVEQLHIVEQL 中的 indexOf 相似函数
【发布时间】:2020-04-20 11:23:02
【问题描述】:

我有以下疑问:

SELECT
    col1,
    case when array_contains(col1, "c") then "c exists" end as col2
FROM
    (
    SELECT
        *
    FROM
        (
        SELECT
            array("a","b","c") AS col1 
        ) q1
    ) q2;

我想检查元素“c”是否出现在数组中的元素“b”之前。在 JavaScript 中我可以使用indexOf(),所以如果在 HiveQL 中有类似的东西我会做类似case when col1.indexOf("b") = col1.indexOf("c") - 1 的东西。

我已经阅读了文档,似乎处理数组的函数很少。

我不想拆分数组并使用LAGLEAD 进行检查。

我尝试过使用field("c", concat_ws(',',col1)),但这似乎也不起作用。

【问题讨论】:

    标签: arrays hive hiveql


    【解决方案1】:

    您可以连接数组并使用likerlike。示例:

    SELECT  concat_ws(',',col1) rlike 'c,b' as c_before_b_flag
    FROM
            (
            SELECT
                array("a","b","c") AS col1 
            ) q1
    

    结果:

    false
    

    rlike 'b,c'true

    【讨论】:

    • 谢谢!不是我所期望的(我对真正的索引功能非常乐观),但它确实有效。我可以使用case when (concat_ws(',',col1) rlike 'b,c' = true) then 1 else 0 end as b_before_c_flag。尽管如此,正则表达式解决方案可以在逻辑发生一些变化时提供帮助,例如,如果我们允许 b 和 c 之间有 2 或 3 个其他元素 (f.i b,x,y,z,c)
    • @agustin 使用case when (concat_ws(',',col1) rlike 'b,c' ) then 1 else 0 end。 = true 似乎是多余的,rlike 是布尔运算符,when 检查布尔值
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2011-01-16
    • 1970-01-01
    • 2017-09-29
    • 2012-05-03
    相关资源
    最近更新 更多