0

我有一张有 15 列的桌子。

其中 2 列具有日期格式,例如:09/08/2003。一列 data_1 是开始日期,另一列 data_2 是结束日期。

我需要计算这与列之间的差异,并检查这个差异是否超过 30 天。

结果必须是一个表,其中的列显示相差超过 30 天的值以及所有其他 15 列。脚本可能与此类似:

table = LOAD '$INPUT' AS (data_1, data_2, a1, a2, ... a13);
ggdif = (data_2 - data_1);
C = FILTER table BY (ggdif > 30) AS differ;
D = FOREACH C GENERATE a1 .. a13;
STORE D INTO '$OUTPUT' USING PigStorage('\t');

我对这个任务有一些问题:

  1. 如何计算两列值之间的差异?

  2. 如何在猪中以正确的格式放置日期?

4

1 回答 1

0

只需编写一个简单的 UDF,将 2 列作为输入。

可能exec(Tuple input) throws IOException {

input(0)andinput(1)转换为Date并执行减法。

返回整数结果。

剩下的就很简单了filter

首先,您可以简单地编写一个类

public class DateDifference extends EvalFunc<Integer>{

public int exec(Tuple input) throws IOException {
// Here you could take input.get(0).toString() and form a Date out of it.
// Same for input.get(1)
// you could either use Java Date or can use Joda Jars for date difference.
// return the date difference as integer.
}
}

准备一罐这个。

在猪壳里

grunt> REGISTER jarname.jar

grunt> diffRow = foreach table generate FLATTEN(yourpackagename.DateDifference($0,$1)), and all your other columns...

休息很简单,我想你可以把剩下的填满。

于 2013-12-05T16:44:55.843 回答