Hive学习(一)group by 报错

先创建表格

CREATE TABLE dm_order_2018(
  id string COMMENT '订单id',
  order_money double COMMENT '订单金额',
  member_id int COMMENT '会员id',
  create_time timestamp COMMENT '创建时间',
  status int COMMENT '订单状态'
)
ROW format delimited fields terminated by '\t';


从本地导入数据

A001    100.15    1    2018-01-01 13:23:12    2
A023    100.15    1    2018-01-01 15:23:12    2
A002    100    2    2018-04-01 14:23:12    2
A003    12.1    3    2018-01-01 13:23:12    2
A004    200.15    4    2018-01-01 13:23:12    2
A005    1200.15    5    2018-01-01 13:23:12    2
A006    0.15    11    2018-01-01 17:23:12    2
A007    1215.1    31    2018-01-01 10:23:12    2
A008    100.75    15    2018-01-01 14:23:12    2
A009    100.15    8    2018-01-01 15:23:12    2
A010    20.15    9    2018-01-01 16:23:12    2
A011    110.15    21    2018-01-01 14:23:12    2
A012    1.15    13    2018-01-01 13:03:12    2
A013    20.15    14    2018-02-01 13:53:12    2
A014    30.15    15    2018-03-01 13:23:12    2
A015    40.5    13    2018-01-01 13:23:12    2
A016    65    1    2017-01-01 13:23:12    2
A017    78.15    1    2017-03-01 09:23:12    1
A018    88.15    1    2017-11-01 20:23:12    2
A019    99    12    2018-02-11 13:23:12    1
A020    10.3    13    2018-04-01 13:23:12    2
A021    600    5    2018-11-01 08:58:31    2
A022    500    31    2018-11-11 08:59:02    2

路径是存放数据的位置

Load data local inpath '/home/hadoop/input/order_2018_data.txt' into table dm_order_2018 partition(dt='2019-01-01');


查找下

练习一:
按用户id分组,消费金额进行降序排序。
最开始用mysql的语句
 

select * from dm_order_2018 
group by member_id 
order by order_memoy desc;



报错:

原因:
group by字句中,select查询的列,要么需要时group by中的列,要么得是聚合函数(sum,count)。不支持直接引用非group by的列。**这点和mysql有区别**。

解决:使用窗口函数
 

select * from
(select id, order_money, member_id, create_time,
row_number() over(partition by member_id order by order_money desc)as row_num 
from dm_order_2018
)t;



查询结果

 

collect_set()函数

select collect_set(id) from dm_order_2018 group by member_id;


结果:

collect_set()作用:按group by 选定的分组,返回该分组下的列的集合可以通过collect_set()[0]来指定集合中的元素。
##总结
1、Hive 不允许访问非group by字段。
2、 使用窗口函数row_number()over(partition by XXX)
3、collect_set()函数可以解决非group by字段的问题。

你可能感兴趣的:(Hive学习笔记)