我有看起来像这样的数据行:

user    startTimestamp endTimestamp   durationForeground    application
11  1409239321000  1409239395000  1     IEXPLORE.EXE
11  1409239322000  0    19      IEXPLORE.EXE
11  1409239341000  0    18      IEXPLORE.EXE
11  1409239359000  0    0       IEXPLORE.EXE
11  1409239359000  0    7       IEXPLORE.EXE
11  1409239366000  0    6       IEXPLORE.EXE
11  1409239372000  0    10      IEXPLORE.EXE
11  1409239382000  0    13      IEXPLORE.EXE
11  1409239395000  1409239446000  9     MSPAINT.EXE
11  1409239404000  0    4       MSPAINT.EXE
11  1409239408000  0    13      MSPAINT.EXE
11  1409239421000  0    12      MSPAINT.EXE
11  1409239433000  0    5       MSPAINT.EXE
11  1409239438000  0    8       MSPAINT.EXE

我希望能够对每个小组的所有duration前景进行汇总;其中,组从具有endTimestamp的行开始,并在下一次开始之前以该行结束。

(这样做的原因是endTimestamp和startTimestamp之间的差异为我们提供了应用程序的运行时间,而durationForeground的总和为我们提供了应用程序处于前台的时间。)

可以用 pig 做吗?

最佳答案

一种选择是您需要按userapplication分组数据并获得durationForeground的总和。

示例示例

输入

11      1409239321000   1409239395000   1       IEXPLORE.EXE
11      1409239322000   0       19      IEXPLORE.EXE
11      1409239341000   0       18      IEXPLORE.EXE
11      1409239359000   0       0       IEXPLORE.EXE
11      1409239359000   0       7       IEXPLORE.EXE
11      1409239366000   0       6       IEXPLORE.EXE
11      1409239372000   0       10      IEXPLORE.EXE
11      1409239382000   0       13      IEXPLORE.EXE
11      1409239395000   1409239446000   9       MSPAINT.EXE
11      1409239404000   0       4       MSPAINT.EXE
11      1409239408000   0       13      MSPAINT.EXE
11      1409239421000   0       12      MSPAINT.EXE
11      1409239433000   0       5       MSPAINT.EXE
11      1409239438000   0       8       MSPAINT.EXE

PigScript:
A = LOAD 'input' USING PigStorage() AS(user:int,startTimestamp:long,endTimestamp:long,durationForeground:long,application:chararray);
B = GROUP A BY (user,application);
C = FOREACH  B GENERATE FLATTEN(group),SUM(A.durationForeground);
DUMP C;

输出:
(11,MSPAINT.EXE,51)
(11,IEXPLORE.EXE,74)

在上述方法中,我假设所有输入字段均由tab(\ t)分隔。

关于hadoop - pig 拉丁语中各组的总结,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28228617/

10-12 23:46