1

フォームの入力レコードがあります

2013-07-09T19:17Z,f1,f2
2013-07-09T03:17Z,f1,f2
2013-07-09T21:17Z,f1,f2
2013-07-09T16:17Z,f1,f2
2013-07-09T16:14Z,f1,f2
2013-07-09T16:16Z,f1,f2
2013-07-09T01:17Z,f1,f2
2013-07-09T16:18Z,f1,f2

これらは、タイムスタンプとイベントを表します。これらは手書きで書いていますが、実際のデータは時間に基づいてソートする必要があります。

連続時系列を必要とするグラフ プロット関数に入力される一連のレコードを生成したいと思います。欠損値を埋めたいのですが、「2013-07-09T19:17Z」と「2013-07-09T19:19Z」のエントリがある場合、「2013-07-09T19:18Z」のエントリを生成したいと思います。 " 事前定義された値で。

これを行うことについての私の考え:

  1. MIN と MAX を使用して、シリーズの開始日と終了日を見つけます
  2. 最小値と最大値を取り、欠落しているタイムスタンプとの関係を返す UDF を記述します
  3. 上記の 2 つの関係を結合する

ただし、PIGでこれを実装する方法については頭に浮かびません。助けていただければ幸いです。

ありがとう!

4

2 に答える 2

1

@Rags の回答に加えて、STREAM x THROUGHコマンドと単純な awk スクリプト (これに似ています) を使用して、最小日付と最大日付を取得したら日付範囲を生成できます。に似たもの (テストされていません! - awk スクリプトをセミコロンのコマンド区切りで 1 行にするか、スクリプト ファイルとして出荷する方がよい場合があります)

grunt> describe bounds;
(min:chararray, max:chararray)
grunt> dump bounds;
(2013/01/01,2013/01/04)
grunt> fullDateBounds = STREAM bounds THROUGH `gawk '{
  split($1,s,"/")
  split($2,e,"/")
  st=mktime(s[1] " " s[2] " " s[3] " 0 0 0")
  et=mktime(e[1] " " e[2] " " e[3] " 0 0 0")
  for (i=st;i<=et;i+=60*24) print strftime("%Y/%m/%d",i)
}'`;
于 2013-07-30T10:49:38.647 に答える
1

MIN と MAX を含む MIN と MAX の間のすべてのタイム スタンプを持つスクリプト (外部 pig) を使用して別のファイルを生成します。これを 2 番目のデータ セットとして読み込みます。これは、あなたのデータセットから使用したサンプルです。すべてではなく、いくつかのギャップのみを埋めたことに注意してください。

2013-07-09T01:17Z,d1,d2
2013-07-09T01:18Z,d1,d2
2013-07-09T03:17Z,d1,d2
2013-07-09T16:14Z,d1,d2
2013-07-09T16:15Z,d1,d2
2013-07-09T16:16Z,d1,d2
2013-07-09T16:17Z,d1,d2
2013-07-09T16:18Z,d1,d2
2013-07-09T19:17Z,d1,d2
2013-07-09T21:17Z,d1,d2

元のデータセットと上記の生成されたデータセットに対して COGROUP を実行します。ネストされた FOREACH GENERATE を使用して、出力データセットを書き込みます。最初のデータセットが空の場合、2 番目のセットの値を使用して出力データセットを生成します。それ以外の場合は最初のデータセットです。これら 2 つのデータセットで使用したコードを次に示します。

Org_Set = LOAD 'pigMissingData/timeSeries' USING PigStorage(',') AS (timeStamp, fl1, fl2);
Default_set = LOAD 'pigMissingData/timeSeriesFull' USING PigStorage(',') AS (timeStamp, fl1, fl2);
coGrouped = COGROUP Org_Set BY timeStamp, Default_set BY timeStamp;

Filled_Data_set = FOREACH coGrouped {
    x = COUNT(times);
    y = (x == 0?  (Default_set.fl1, Default_set.fl2): (Org_Set.fl1, Org_Set.fl2));
    GENERATE FLATTEN(group), FLATTEN(y.$0), FLATTEN(y.$1);
};

さらに説明が必要な場合や助けが必要な場合はお知らせください

于 2013-07-30T05:49:09.077 に答える