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');

查找下


Hive学习(一)group by 报错_第1张图片
image.png

练习一:

-- 按用户id分组,消费金额进行降序排序。

最开始用mysql的语句

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

报错:


image.png

原因:

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;

查询结果

Hive学习(一)group by 报错_第2张图片
image.png

collect_set()函数

select collect_set(id) from dm_order_2018 group by member_id;

结果:


Hive学习(一)group by 报错_第3张图片
image.png

collect_set()作用:按group by 选定的分组,返回该分组下的列的集合可以通过collect_set()[0]来指定集合中的元素。

总结

1、Hive 不允许访问非group by字段。
2、 使用窗口函数row_number()over(partition by XXX)
3、collect_set()函数可以解决非group by字段的问题。

你可能感兴趣的:(Hive学习(一)group by 报错)