アントフォレスト(ハイブ)クエリ演習

蟻の森の背景の説明:

次の表は、AntForestでのユーザーの毎日の低炭素生活の記録フローを記録しています。
table_name:user_low_carbon
user_id data_dt low_carbon
ユーザー日付による炭素排出量の削減(g)

炭素排出削減を記録するために使用されるAntの森林植物償還フォームは、環境に優しい植物のために適用する必要が
TABLE_NAME:plant_carbon
plant_id plant_name low_carbon
植物の数植物名償還工場はカーボン必要

1.テーブルを作成します

create table user_low_carbon(
user_id String,data_dt String,low_carbon int)
 row format delimited fields terminated by '\t';
 
create table plant_carbon(
plant_id string,plant_name String,low_carbon int) 
row format delimited fields terminated by '\t';

2.データ
tree.txtをロードします

p001	梭梭树	17
p002	沙柳	19
p003	樟子树	146
p004	胡杨	215

zfb.txt

u_001	2017/1/1	10
u_001	2017/1/2	150
u_001	2017/1/2	110
u_001	2017/1/2	10
u_001	2017/1/4	50
u_001	2017/1/4	10
u_001	2017/1/6	45
u_001	2017/1/6	90
u_002	2017/1/1	10
u_002	2017/1/2	150
u_002	2017/1/2	70
u_002	2017/1/3	30
u_002	2017/1/3	80
u_002	2017/1/4	150
u_002	2017/1/5	101
u_002	2017/1/6	68
u_003	2017/1/1	20
u_003	2017/1/2	10
u_003	2017/1/2	150
u_003	2017/1/3	160
u_003	2017/1/4	20
u_003	2017/1/5	120
u_003	2017/1/6	20
u_003	2017/1/7	10
u_003	2017/1/7	110
u_004	2017/1/1	110
u_004	2017/1/2	20
u_004	2017/1/2	50
u_004	2017/1/3	120
u_004	2017/1/4	30
u_004	2017/1/5	60
u_004	2017/1/6	120
u_004	2017/1/7	10
u_004	2017/1/7	120
u_005	2017/1/1	80
u_005	2017/1/2	50
u_005	2017/1/2	80
u_005	2017/1/3	180
u_005	2017/1/4	180
u_005	2017/1/4	10
u_005	2017/1/5	80
u_005	2017/1/6	280
u_005	2017/1/7	80
u_005	2017/1/7	80
u_006	2017/1/1	40
u_006	2017/1/2	40
u_006	2017/1/2	140
u_006	2017/1/3	210
u_006	2017/1/3	10
u_006	2017/1/4	40
u_006	2017/1/5	40
u_006	2017/1/6	20
u_006	2017/1/7	50
u_006	2017/1/7	240
u_007	2017/1/1	130
u_007	2017/1/2	30
u_007	2017/1/2	330
u_007	2017/1/3	30
u_007	2017/1/4	530
u_007	2017/1/5	30
u_007	2017/1/6	230
u_007	2017/1/7	130
u_007	2017/1/7	30
u_008	2017/1/1	160
u_008	2017/1/2	60
u_008	2017/1/2	60
u_008	2017/1/3	60
u_008	2017/1/4	260
u_008	2017/1/5	360
u_008	2017/1/6	160
u_008	2017/1/7	60
u_008	2017/1/7	60
u_009	2017/1/1	70
u_009	2017/1/2	70
u_009	2017/1/2	70
u_009	2017/1/3	170
u_009	2017/1/4	270
u_009	2017/1/5	70
u_009	2017/1/6	70
u_009	2017/1/7	70
u_009	2017/1/7	70
u_010	2017/1/1	90
u_010	2017/1/2	90
u_010	2017/1/2	90
u_010	2017/1/3	90
u_010	2017/1/4	90
u_010	2017/1/4	80
u_010	2017/1/5	90
u_010	2017/1/5	90
u_010	2017/1/6	190
u_010	2017/1/7	90
u_010	2017/1/7	90
u_011	2017/1/1	110
u_011	2017/1/2	100
u_011	2017/1/2	100
u_011	2017/1/3	120
u_011	2017/1/4	100
u_011	2017/1/5	100
u_011	2017/1/6	100
u_011	2017/1/7	130
u_011	2017/1/7	100
u_012	2017/1/1	10
u_012	2017/1/2	120
u_012	2017/1/2	10
u_012	2017/1/3	10
u_012	2017/1/4	50
u_012	2017/1/5	10
u_012	2017/1/6	20
u_012	2017/1/7	10
u_012	2017/1/7	10
u_013	2017/1/1	50
u_013	2017/1/2	150
u_013	2017/1/2	50
u_013	2017/1/3	150
u_013	2017/1/4	550
u_013	2017/1/5	350
u_013	2017/1/6	50
u_013	2017/1/7	20
u_013	2017/1/7	60
u_014	2017/1/1	220
u_014	2017/1/2	120
u_014	2017/1/2	20
u_014	2017/1/3	20
u_014	2017/1/4	20
u_014	2017/1/5	250
u_014	2017/1/6	120
u_014	2017/1/7	270
u_014	2017/1/7	20
u_015	2017/1/1	10
u_015	2017/1/2	20
u_015	2017/1/2	10
u_015	2017/1/3	10
u_015	2017/1/4	20
u_015	2017/1/5	70
u_015	2017/1/6	10
u_015	2017/1/7	80
u_015	2017/1/7	60
load data local inpath "/home/hdfs/zfb.txt" into table user_low_carbon;
load data local inpath "/home/hdfs/tree.txt" into table plant_carbon;

3.ローカルモードを設定します
set hive.exec.mode.local.auto=true;

トピック

(1)10月1日までの各ユーザーの総炭素排出削減量を数えます(上位11位に入る)

select
user_id,
sum(low_carbon) lc
from user_low_carbon
where date_format(regexp_replace(data_dt,"/","-"),"yyyy-MM")<"2017-10"
group by user_id
order by lc desc
limit 11;

結果

user_id lc
u_007   1470
u_013   1430
u_008   1240
u_005   1100
u_010   1080
u_014   1060
u_011   960
u_009   930
u_006   830
u_002   659
u_004   640
Time taken: 10.984 seconds, Fetched: 11 row(s)

(2)Populus euphratica
plant_carbon
plant_id plant_name low_carbon
plant number plant nameの申請条件を取り、植物に必要な炭素を償還する

select
low_carbon
from plant_carbon
where plant_id="p004"

(3)サリウの申請条件を取ります

select
low_carbon
from plant_carbon
where plant_id="p002"

(4)サリックスに申し込むことができるサリックスの数を見つける

select
user_id,
floor(t1.lc/(select
low_carbon lc
from plant_carbon
where plant_id="p002")) num
from
(
select
user_id,
sum(low_carbon) lc
from user_low_carbon
group by user_id
) t1
;

結果

user_id num
u_001   25
u_002   34
u_003   32
u_004   33
u_005   57
u_006   43
u_007   77
u_008   65
u_009   48
u_010   56
u_011   50
u_012   13
u_013   75
u_014   55
u_015   15

(5)後ろよりも前に何本の木があるか調べます

select
user_id,
num,
bef,
num-bef
from
(
select
user_id,
num,
lag(num,1,0) over(order by num desc ) bef
from
(
select
user_id,
floor(t1.lc/(select
low_carbon lc
from plant_carbon
where plant_id="p002")) num
from
(
select
user_id,
sum(low_carbon) lc
from user_low_carbon
group by user_id
) t1
) t2
) t3

結果

user_id num     _c2
u_007   77      77
u_013   75      -2
u_008   65      -10
u_005   57      -8
u_010   56      -1
u_014   55      -1
u_011   50      -5
u_009   48      -2
u_006   43      -5
u_002   34      -9
u_004   33      -1
u_003   32      -1
u_001   25      -7
u_015   15      -10
u_012   13      -2
Time taken: 138.272 seconds, Fetched: 15 row(s)

注:
前機能:
datediff:2回の差
見つけるregexp_replace:シンボルを置き換えるto_date:
文字列を時刻に変換する
date_sub:時刻と数値の差を見つける

丸める:切り上げる
床:
切り下げる天井:切り上げる

部分文字列

おすすめ

転載: blog.csdn.net/qq_42706464/article/details/108276238