Hiveのよくあるカスケード求和演算思想解析
5629 ワード
1.需要:
以下の訪問者アクセス数統計表t_access_times訪問者月訪問回数A 2015-01-02 5 A 2015-01-03 15 B 2015-01-01 5 A 2015-01-04 8 B 2015-01-05 25 A 2015-01-06 5 A 2015-02-02 4 A 2015-02-06 6 B 2015-02-06 10 B 2015-02-07…
2.レポートを出力する必要がある:t_access_times_accumulate
訪問者月間訪問合計累計訪問合計A 2015-01 33 33 A 2015-02 10 43……………B 2015-01 30 30 B 2015-02 15 45 ……. ……. ……. …….
3.毎日の表t_によるaccess_timesは、毎月のアクセス数を取得し、毎月のアクセス数に基づいて取得します。
1月、月30回、全部で30回2月、月10回、全部で40回3月、月20回、全部で60回...
4.考え方:
#
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;
元のデータ:
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
5.最初のステップは、まずユーザーの月額総額sumを求めることが内蔵求和関数である。
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 | ±----------±---------±--------±-+
第2歩、月額総額表を自分で接続する
(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
±------------±---------±----------±------------±---------±----------±-+ | 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、前のステップの結果から
グループクエリーを行います.グループのフィールドはa.username a.month月積算値です.b.month<=a.monthのすべてのb.salaryを合計すればいいです.
#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; //