hive累積レポートの詳細

3463 ワード

ビジネスシーン:
訪問者1回あたりの金額統計表t_access_times
訪問者

金額
A
2015-01
5
A
2015-01
15
B
2015-01
5
A
2015-01
8
B
2015-01
25
A
2015-01
5
A
2015-02
4
A
2015-02
6
B
2015-02
10
B
2015-02
5
……
……
……
 
レポートを出力する必要があります:t_access_times_accumulate
訪問者

月アクセス合計
累計金額
A
2015-01
33
33
A
2015-02
10
43
…….
…….
…….
…….
B
2015-01
30
30
B
2015-02
15
45
…….
…….
…….
…….
 
実装手順:
1.テーブルを作成し、データをインポートする
create table t_access_times(username string,month string,salary int)
row format delimited fields terminated by ',';

load data local inpath '/home/hadoop/t_access_times.dat' into table t_access_times;

2.第一歩、まず各ユーザーの月額総額を求める
select username,month,sum(salary) as salary from t_access_times group by username,month

結果は次のとおりです.
+-----------+----------+---------+--+ | username  |  month   | salary  | +-----------+----------+---------+--+ | A         | 2015-01  | 33      | | A         | 2015-02  | 10      | | B         | 2015-01  | 30      | | B         | 2015-02  | 15      | +-----------+----------+---------+--+
第二歩は、月額総額表を自分とjoin
select A.*,B.* FROM
(select username,month,sum(salary) as salary from t_access_times group by username,month) A  
inner join 
(select username,month,sum(salary) as salary from t_access_times group by username,month) B 
on
A.username=B.username;

結果は次のとおりです.
+-------------+----------+-----------+-------------+----------+-----------+--+ | a.username  | a.month  | a.salary  | b.username  | b.month  | b.salary  | +-------------+----------+-----------+-------------+----------+-----------+--+ | A           | 2015-01  | 33        | A           | 2015-01  | 33        | | A           | 2015-01  | 33        | A           | 2015-02  | 10        | | A           | 2015-02  | 10        | A           | 2015-01  | 33        | | A           | 2015-02  | 10        | A           | 2015-02  | 10        | | B           | 2015-01  | 30        | B           | 2015-01  | 30        | | B           | 2015-01  | 30        | B           | 2015-02  | 15        | | B           | 2015-02  | 15        | B           | 2015-01  | 30        | | B           | 2015-02  | 15        | B           | 2015-02  | 15        | +-------------+----------+-----------+-------------+----------+-----------+--+
3、ステップ3、前のステップの結果からグループクエリーを行い、グループのフィールドはa.usernameとa.monthで月積算値を求める:b.month<=a.monthのすべてのb.salaryを合計すればよい
3つのステップを結合し、SQLは次のようになります.
select A.username,A.month,max(A.salary) as salary,sum(B.salary) as accumulate
from 
(select username,month,sum(salary) as salary from t_access_times group by username,month) A 
inner join 
(select username,month,sum(salary) as salary from t_access_times group by username,month) B
on
A.username=B.username
where B.month <= A.month
group by A.username,A.month
order by A.username,A.month;

出力結果:
訪問者月額総額累計金額A 2015-01 33 33 A 2015-02 10 43.....        …….    …….       …….         B        2015-01       30            30 B        2015-02       15            45 …….        …….    …….    …….