0

15列のテーブルがあります。

この列のうち 2 つは日付形式です。たとえば、2003 年 9 月 8 日です。1 つの列 data_1 は開始日、もう 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列の値の差を数える方法は?

  2. 豚に正しい形式で日付を入れる方法は?

4

1 に答える 1

0

2 つの列を入力として受け取る単純な UDF を作成するだけです。

になり得る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 に答える