配置单元中的 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)
完整的问题是,当我运行脚本时,我需要从命令行参数动态读取val1
和val2
,而且我通常不知道会以多少个值为条件。所以你可以认为vals
是一个逗号分隔的列表(或数组),包含值val1
、val2
、...
,我想写
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 多个值的主要内容,如果未能解决你的问题,请参考以下文章
array_contains 等效于 HiveQL 中的 JSON