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.テーブルを作成し、データをインポートする
2.第一歩、まず各ユーザーの月額総額を求める
結果は次のとおりです.
+-----------+----------+---------+--+ | username | month | salary | +-----------+----------+---------+--+ | A | 2015-01 | 33 | | A | 2015-02 | 10 | | B | 2015-01 | 30 | | B | 2015-02 | 15 | +-----------+----------+---------+--+
第二歩は、月額総額表を自分とjoin
結果は次のとおりです.
+-------------+----------+-----------+-------------+----------+-----------+--+ | 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は次のようになります.
出力結果:
訪問者月額総額累計金額A 2015-01 33 33 A 2015-02 10 43..... ……. ……. ……. B 2015-01 30 30 B 2015-02 15 45 ……. ……. ……. …….
訪問者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 ……. ……. ……. …….