配置单元中的 ARRAY_CONTAINS 多个值

Posted

技术标签:

【中文标题】配置单元中的 ARRAY_CONTAINS 多个值【英文标题】:ARRAY_CONTAINS muliple values in hive 【发布时间】:2014-09-03 13:23:28 【问题描述】:

有没有一种方便的方法可以在 hive 中使用 ARRAY_CONTAINS 函数来搜索数组列中的多个条目,而不仅仅是一个?所以而不是:

WHERE ARRAY_CONTAINS(array, val1) OR ARRAY_CONTAINS(array, val2)

我想写:

WHERE ARRAY_CONTAINS(array, val1, val2)

完整的问题是,当我运行脚本时,我需要从命令行参数动态读取val1val2,而且我通常不知道会以多少个值为条件。所以你可以认为vals 是一个逗号分隔的列表(或数组),包含值val1val2...,我想写

WHERE ARRAY_CONTAINS(array, vals)

提前致谢!

【问题讨论】:

【参考方案1】:

有一个 UDF here 可以让您获取两个数组的交集。假设你的价值观有结构

values_array = [val1, val2, ..., valn]

你可以这样做

where array_intersection(array, values_array)[0] is not null

如果它们没有任何共同的元素,将返回[],因此[][0] 将是null

【讨论】:

我和发电机在同一条船上,这仍然是最好的解决方案吗? 是的,我认为这是你最好的选择。【参考方案2】:
Create table tmp_cars AS  Select make,COLLECT_LIST(TRIM(model))
model_List from default.cars GROUP  BY make;

Select array_contains(model_List,CAST('Rainier' as varchar(40)))
FROM Default.tmp_cars t
where make = 'Buick';

数据

["Rainier","Rendezvous CX","Century Custom 4dr","LeSabre Custom 4dr","Regal LS 4dr","Regal GS 4dr","LeSabre Limited 4dr","Park Avenue 4dr","公园大道超 4dr"]

返回 是的

【讨论】:

【参考方案3】:

选择 * 从表 侧视图 explode(array) a as arr 在哪里 (vals) ;

【讨论】:

以上是关于配置单元中的 ARRAY_CONTAINS 多个值的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Hive:array_contains

array_contains 等效于 HiveQL 中的 JSON

为 Spark SQL 寻找 ARRAY_CONTAINS 的替代解决方案

如何根据多个单元格中的值自动填充

来自选择查询的一个单元格中的多个值

将单元格中的多个值拆分为多行 - Oracle SQL