hive常见习题解析

hive常见习题解析

  1. 已有shop_id,item_id,num三列, 使用HiveSQL计算得到a,b列(温馨提示: 按照shop_id分组, a为num值/每组num的和, b为a的组内排序)
    在这里插入图片描述
    解析:

建表

create table shops(
shop_id char(1),
item_id char(1), 
num int
);

插入数据

Insert into shops values
("A","a",10),
("A","b",12),
("B","a",8),
("A","c",5),
("B","c",8),
("C","b",9);

查询:

select shop_id,item_id,num,
num/sum(num) over (distribute by shop_id) a,
rank() over (distribute by shop_id sort by num desc)b
from shops;


  1. 使用hive计算num列的sum值
    在这里插入图片描述
    解析: 需结合侧视图使用行转列函数explode

建表

create table test2(
item char(1),
num int
stored textfile;

插入数据

insert into test2 values
("A",1,2,3,4),
("B",2,5,1);

查询:

select item,num,sum(tmp.c) sum from test2
lateral view explode(split(num,",")) tmp as c
group by item,num;


  1. 货拉拉2004-2006年订单收入 hll_city_income 如下:
年份大区城市收入(单位千万)
t_yeart_regiont_cityt_money
2004华南深圳70
2005华南深圳80
2006华南深圳100
2004华南广州40
2005华南广州90
2006华南广州110
2004华北北京60
2005华北北京80
2006华北北京120

写一段SQL,输出如下结果,结果保留两位小数

年份华南总收入华北总收入华南平均收入华北平均收入收入第一名
t_yeart_south_moneyt_north_moneyt_south_avg_moneyt_north_avg_moneyt_first_city
2004110.0060.0055.0060.00深圳
2005170.0080.0085.0080.00广州
2006210.00120.00105.00120.00北京

解析:

编辑 hll.txt 文件,内容如下:

2004,华南,深圳,70
2005,华南,深圳,80
2006,华南,深圳,100
2004,华南,广州,40
2005,华南,广州,90
2006,华南,广州,110
2004,华北,北京,60
2005,华北,北京,80
2006,华北,北京,120

hll.txt 上传至 hdfs: /data/hll0902/ 目录下

建表

CREATE EXTERNAL TABLE `hll_city_income`(
`t_year` string,
`t_region` string,
`t_city` string,
`t_money` int)
COMMENT 'huolala interview'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile
location '/data/hll0902';

查询:

方法①:使用round保留两位小数有时候并不生效,推荐使用方法②

with t as
(
select * ,
row_number() over(distribute by t_year sort by t_money desc) drn
from hll_city_income
)
select 
t_year,
round(sum(case when t_region='华南' then t_money else 0 end),2) t_south_money,
round(sum(case when t_region='华北' then t_money else 0 end),2) t_north_money,
round(sum(case when t_region='华南' then t_money else 0 end)/sum(case when t_region='华南' then 1 else 0 end),2) t_south_avg_money,
round(sum(case when t_region='华北' then t_money else 0 end)/sum(case when t_region='华北' then 1 else 0 end),2) t_north_avg_money,
max(case when t.drn=1 then t_city else 0 end) t_first_city
from t group by t.t_year;

结果如下:
在这里插入图片描述

方法②: 使用 cast转型,将数据转为 decimal 类型

select 
t.t_year,
cast(sum(case when t.t_region='华南' then t.t_money else 0 end ) as decimal(10,2)) t_south_money,
cast(sum(case when t.t_region='华北' then t.t_money else 0 end ) as decimal(10,2)) t_north_money,
cast(sum(case when t.t_region='华南' then t.t_money else 0 end )/sum(case when t.t_region='华南' then 1 else 0 end )as decimal(10,2)) t_south_avg_money,
cast(sum(case when t.t_region='华北' then t.t_money else 0 end )/sum(case when t.t_region='华北' then 1 else 0 end )as decimal(10,2)) t_north_avg_money,
max(case when t.drn=1 then t.t_city else 0 end ) t_first_city 
from 
(
select 
tci.*,
row_number() over(distribute by tci.t_year sort by tci.t_money desc ) drn 
from hll_city_income tci
) t
group by t.t_year
;

结果如下:
在这里插入图片描述



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值