我问了这个关于如何使用 SQL 获得不同用户的滚动计数的问题,但我也可以使用 Hadoop,现在我想知道这种分析是否更适合 Hadoop。不幸的是,我是 Hadoop 的新手,所以除了加载数据和最基本的 MapReduce 作业之外,我不知道如何处理这个问题。假设这是 Hadoop 的一个很好的候选者,最好的方法是什么?
问问题
133 次
1 回答
0
在 map reduce 中对此进行建模的一种可能方法:
- M/R 工作 1:
- 映射器:从 CONNECT_TS(输出值)中提取并输出 USER_ID(输出键)和日期部分。
- Reducer:对于每个 USER_ID 组(输出键),输出观察到的最小日期(输出值)
- M/R 工作 2:
- 映射器:从之前的作业输出,交换键/值对(DATE 作为输出键,USER_ID 作为值)
- Reducer(单个):对于每个输入键(日期),统计用户数(值),将这个数与累计运行总数一起输出。
在 Pig 中,除了保持运行总数之外的所有操作都可以使用以下脚本完成:
A = LOAD '/home/cswhite/data.tsv' USING PigStorage('\t') AS (SESSION, USER_ID, TIMESTAMP);
B = foreach A GENERATE USER_ID, SUBSTRING(TIMESTAMP, 0, 10) AS DATE;
BF = filter B by DATE > '2013-01-01';
C = group BF by USER_ID;
D = foreach C {
sorted = order BF by DATE;
earliest = limit sorted 1;
generate group, flatten(earliest);
}
E = foreach D generate group as USER_ID, earliest::DATE as DATE;
F = group E by DATE;
G = foreach F generate group as DATE, COUNT(E) as USERS_CNT;
H = group G by ALL
I = foreach G generate SUM(G.USERS_CNT) as TOTAL_USERS;
因此,对于以下制表符分隔的输入数据:
1 99 2013-01-01 2:23:33
2 101 2013-01-01 2:23:55
3 104 2013-01-01 2:24:41
4 101 2013-01-01 2:24:43
5 101 2013-01-02 2:25:01
6 102 2013-01-02 2:26:01
7 99 2013-01-03 2:27:01
8 92 2013-01-04 2:28:01
9 234 2013-01-05 2:29:01
别名G
如下:
(2013-01-01,3)
(2013-01-02,1)
(2013-01-04,1)
(2013-01-05,1)
别名“我”是:
(5)
于 2013-06-18T00:56:42.570 回答