0

我问了这个关于如何使用 SQL 获得不同用户的滚动计数的问题,但我也可以使用 Hadoop,现在我想知道这种分析是否更适合 Hadoop。不幸的是,我是 Hadoop 的新手,所以除了加载数据和最基本的 MapReduce 作业之外,我不知道如何处理这个问题。假设这是 Hadoop 的一个很好的候选者,最好的方法是什么?

4

1 回答 1

0

在 map reduce 中对此进行建模的一种可能方法:

  1. M/R 工作 1:
    • 映射器:从 CONNECT_TS(输出值)中提取并输出 USER_ID(输出键)和日期部分。
    • Reducer:对于每个 USER_ID 组(输出键),输出观察到的最小日期(输出值)
  2. 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 回答