Hive 的collect_set使用详解

转载 2018年04月16日 14:46:08

有这么一需求,在Hive中求出一个数据表中在某天内首次登陆的人;可以借助collect_set来处理sql:

[html] view plain copy
 
  1. select count(a.id)   
  2. from (select id,collect_set(time) as t from t_action_login where time<='20150906' group by id) as a where size(a.t)=1 and a.t[0]='20150906';  

上面中的

[html] view plain copy
 
  1. select id,collect_set(time) as t from t_action_login where time<='20150906' group by id  
会按照id分组,因为一个id可能对应一天也可能对应多天,对应多天表示有多天都有登陆,所以一个id会对应多个日期time,通过collect_set会把每个id所对应的日期构建成一个以逗号分隔的数组返回。上述SQL返回:

[html] view plain copy
 
  1.   123@163.com                                                                                      | ["20150620","20150619"]                                                                                    |  
  2. | abc@163.com                                                                                      | ["20150816"]                                                                                               |  
  3. | cde@qq.com                                                                                       | ["20150606","20150608","20150607","20150609","20150613","20150610","20150616","20150615"]                  |  
  4. | 789@sohu.com                                                                                     | ["20150827","20150623","20150627","20150820","20150823","20150612","20150717"]                             |  
  5. | 987@163.com                                                                                      | ["20150701","20150829","20150626","20150625","20150726","20150722","20150629","20150824","20150716","20150 |  
  6. | ddsf@163.com                                                                                     | ["20150804","20150803","20150801","20150809","20150807","20150806","20150905","20150904","20150730","20150 |  
  7. | 182@163.com                                                                                      |["20150803","20150801","20150809","20150808","20150805","20150806","20150906","20150904","20150730","20150 |  
  8. | 22225@163.com                                                                                    | ["20150604","20150609","20150622","20150827","20150625","20150620","20150613","20150610","20150614","20150 |  
  9. | 18697@qq.com                                                                                     | ["20150902"]                                                                                               |  
  10. | 1905@qq.com                                                                                      | ["20150709"]                                         

所以我们就可以按照这个返回的数组做文章,即为

[html] view plain copy
 
  1. where size(a.t)=1 and a.t[0]='20150906';  
表示某id所对应的数组长度为1 并且第一个时间为20150906的id表示为该天首次登陆。

总结:

  1. Hive不允许直接访问非group by字段;
  2. 对于非group by字段,可以用Hive的collect_set函数收集这些字段,返回一个数组;
  3. 使用数字下标,可以直接访问数组中的元素;

Hive的collect_set使用详解

有这么一需求,在Hive中求出一个数据表中在某天内首次登陆的人;可以借助collect_set来处理sql: [html] view plain copy  print? sel...
  • qq_33792843
  • qq_33792843
  • 2017年08月09日 17:51
  • 244

HIVE中关于collect_set与explode函数妙用

hive的复合数据类型hive中的列支持使用三类复杂的集合数据类型,即:array,map及struct,这些类型的名称是保留字,具体用法可参见该篇博文,里面有关于三类基本集合数据类型的操作实例,注:...
  • sinat_29508201
  • sinat_29508201
  • 2015年08月31日 19:30
  • 13518

Hive 的collect_set使用详解

Hive 的collect_set使用详解
  • liyantianmin
  • liyantianmin
  • 2015年09月07日 10:30
  • 23520

hive中的concat,concat_ws,collect_set用法

需求:对用户的订单进行分析,将不同订单类型分别多少单展示出来,每个用户一行 原数据: user order_type order_number user1 de...
  • waiwai3
  • waiwai3
  • 2018年01月16日 10:12
  • 724

Hive sql 使用group by 字段被限制使用 collect_set/collect_list处理

hive> SELECT userid FROM T_BZ_ClientActionLog GROUP BY Sequnce ,ActionTime limit 100; FAILED: Seman...
  • zhoujj303030
  • zhoujj303030
  • 2014年08月07日 20:14
  • 11503

用spark实现hive中的collect_set函数的功能

import org.apache.spark.SparkContext._ import org.apache.spark._ /** * Created by xiaojun on 2015/...
  • xiao_jun_0820
  • xiao_jun_0820
  • 2015年03月12日 14:42
  • 2830

Hive--行转列(Lateral View explode())和列转行(collect_set() 去重)

1.行转列 1.1 问题引入: 如何将 a       b       1,2,3 c       d       4,5,6 变为: a       b       1 a       b   ...
  • Xw_Classmate
  • Xw_Classmate
  • 2016年03月11日 11:29
  • 7876

hive collect_set,lateral view,explode 实现行列转换

hive sql 实现行列转换
  • zwj841558
  • zwj841558
  • 2017年05月23日 11:50
  • 602

[Hive]用concat_w实现将多行记录合并成一行

hive concat_w实现将多行记录合并成一行
  • yeweiouyang
  • yeweiouyang
  • 2014年11月19日 19:51
  • 14744

hive列转行 (collect_all()/collect_list() 不去重)

collect_all()     hive 0.12 collect_list()  hive 0.13 一、问题 hive如何将 a       b...
  • liuxiao723846
  • liuxiao723846
  • 2016年11月17日 20:26
  • 3722
收藏助手
不良信息举报
您举报文章:Hive 的collect_set使用详解
举报原因:
原因补充:

(最多只允许输入30个字)