HIVEQL 中的 indexOf 相似函数
Posted
技术标签:
【中文标题】HIVEQL 中的 indexOf 相似函数【英文标题】:indexOf alike function in HIVEQL 【发布时间】: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
的东西。
我已经阅读了文档,似乎处理数组的函数很少。
我不想拆分数组并使用LAG
或LEAD
进行检查。
我尝试过使用field("c", concat_ws(',',col1))
,但这似乎也不起作用。
【问题讨论】:
【参考方案1】:您可以连接数组并使用like
或rlike
。示例:
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
检查布尔值以上是关于HIVEQL 中的 indexOf 相似函数的主要内容,如果未能解决你的问题,请参考以下文章