irpas技术客

hivesql -- array_contains()函数使用_扫地增_array_contains

大大的周 5053

array_contains函数解析

Hive中的array_contains函数与SQL中的 in关键字 操作类似,用于判定 包含(array_contains)或不包含(!array_contains)关系。与 in不同的是array_contains可以用于判断一张表中同一个id的多条记录中的同一字段是否包含指定的一个或多个值。需要注意字段类型保持一致,若不一致则需要进行强制类型转换。

语法:

array_contains(数组,值),返回布尔类型值。

array_contains(数组,值) array_contains()函数在where条件中的案例

解决使用某个字段条件过多,查询条件失效

select * from login where dt='20130101' and (ver !='3.1' or ver !='3.2' or ver != '4.0' or ver != '5.2'); select * from login where dt='20130101' and (ver !='3.1' and ver !='3.2' and ver != '4.0' and ver != '5.2');

这个语句的目的是从一个用户登陆表中,查询20130101当天,版本不是3.1,3.2,4.0,5.2的登陆用户记录。但是,在hive0.90执行,最后返回的是20130101当天全部的登陆用户记录,后面的查询条件看起来是被忽略了。这里看起来同一个字段做这种多个!=或者=的条件查询,过多会失效。

于是修改了语句,如下:

select * from login where dt=20130101 and !array_contains(split('3.1,3.2,4.0,5.2',','),ver); array_contians()直接应用案例: 1、使用array_contians()对监控指标打标签,判断报警级别。 select task_id, task_code, task_version, case when array_contains(collect_set(tag_id), 599) or array_contains(collect_set(tag_id), 1225) then 'L1-级别' when array_contains(collect_set(tag_id), 600) or array_contains(collect_set(tag_id), 1226) then 'L2-级别' when array_contains(collect_set(tag_id), 601) or array_contains(collect_set(tag_id), 1240) then 'L3-级别' when array_contains(collect_set(tag_id), 1166) or array_contains(collect_set(tag_id), 1241) then '鹰眼监控汇总' else '非鹰眼监控任务' end as core_tag_name from fdm.fdm_buffalo_uniontask_tag_theme_info_new where dt = sysdate( - 1) group by task_id, task_code, task_version 2、使用array_contians()对用户打标签,在用户画像,维度搭建中发挥作用 select user_id, count(*) as card_number -- 使用过的卡数 -- 只要任意一张卡有效即判定为VIP有效, case when array_contains(collect_set(status_code),cast(1 as smallint)) then 1 else 0 end AS effective_flag -- 卡有效标识 from edw_users.dwd_edw_user_vipcard_df -- 用户VIP卡购买使用全量表 where dt = '${dt}' and user_id > 0 and deleted_flag = 'N' group by user_id


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #array_contains #from #login #where #dt20130101