2017-05-21 13 views
1

プロジェクトでは、受け取った入力データに基づいて集計と計算を定期的に計算する必要があります。Azureデータの時間差を計算するLake Analytics U-SQLジョブ

1つの頻繁な要件は、入力データストリームの特定の行の時間差を計算することです。例えば

、これは私の入力データストリームである:

タイムスタンプイベントバリュー
2017年5月21日11時33 E1 17
2017年5月21日11時37分e2の18
2017-05-私は今、e2のイベントと最後の受信との間のすべてのタイムスパンを計算したい21 11:38 E3 18
2017年5月21日11時39分E1 19
2017年5月21日11時42分e2の19

e1イベント(タイムスタンプ順)。

私は結果があることが期待

: 3(分) 4(分)

同様の要件は、ここでイベントの同じタイプ間(E1イベントの間、すなわち、すべての違いを)タイムスパンを計算することであろう 6(分)これまで

私の試み:私はこの結果を予想する分析のこの種のは、かなり簡単にWHEN句と一緒にLAG関数を使用して達成することができたが、残念ながらWHEN句が欠落してい

イン・ユア-SQL。 T-SQLの場合、ステートメントのSELECT-ClauseでSub-Selectsを使用してこれを解決することもできますが、残念ながらU-SQLではこれもできません。

この問題の解決方法に関するご意見やサンプルスクリプトはありますか? ありがとうございました!

答えて

1

U-SQLでは、簡単な日付演算にc#メソッドを使用できます。

:サンプルデータのための4と3分を示す、

@data = 
    EXTRACT Timestamp DateTime, 
      Event string, 
      Value int 
    FROM "/input/input58.csv" 
    USING Extractors.Csv(); 

//@data = SELECT * 
//  FROM (
//  VALUES 
//  ("2017-05-21 11:33", "e1", 17), 
//  ("2017-05-21 11:37", "e2", 18), 
//  ("2017-05-21 11:38", "e3", 18), 
//  ("2017-05-21 11:39", "e1", 19), 
//  ("2017-05-21 11:42", "e2", 19) 
// ) AS T(Timestamp, Event, Value); 


@e1 = 
    SELECT ROW_NUMBER() OVER(ORDER BY Timestamp) AS rn, 
      * 
    FROM @data 
    WHERE Event == "e1"; 

@e2 = 
    SELECT ROW_NUMBER() OVER(ORDER BY Timestamp) AS rn, 
      * 
    FROM @data 
    WHERE Event == "e2"; 

@working = 
    SELECT 
     (e2.Timestamp - e1.Timestamp).TotalSeconds AS diff_sec, 
     (e2.Timestamp - e1.Timestamp).ToString() AS diff_hhmmss, 
     e1.Timestamp AS ts1, 
     e2.Timestamp AS ts2 
    FROM @e1 AS e1 
      INNER JOIN @e2 AS e2 ON e1.rn == e2.rn; 


OUTPUT @working TO "/output/output.csv" 
USING Outputters.Csv(quoting:false); 

マイ結果:あなたのデータはあなたが説明するような単純な場合には、あなただけの、そして、それらを結合するこのような何かをe1とe2のイベントをランク付けすることができResults

それはあなたのために働くでしょうか?そうでない場合は、より現実的なデータサンプルを提供してください。

+0

U-SQLではサブクエリが簡単にできると感じました。 Itzik Ben-Ganから私の「ギャップと島々」を見つけなければならないことを私に思い出させる! – wBob

+0

良いもの、ボブ!それは合理的に見える!ありがとうございました! –

+0

_realisticデータsample_で展開すると、このソリューション(設計上)はe1イベントとe2イベントの間に完全な1:1対応が必要です。これは本当に強力な要件です。間違った時間ログ、失敗したイベント、繰り返されたイベントなどがあります。このような収差は、私の経験では実世界のデータ、例えばマルチマシン計測器の照合で発生する傾向があります。 – Nabeel

1
@data = 
    SELECT 
     LAST_VALUE(Event == "e1" ? Timestamp : (DateTime?)null) OVER (ORDER BY Timestamp) AS E1Time 
     // MAX(Event == "e1" ? Timestamp : DateTime.MinValue) OVER (ORDER BY Timestamp) AS E1Time 
     , Timestamp AS E2Time 
    FROM @events 
    HAVING Event == "e2" 
    ; 

集計/ WFでためには、(少なくとも彼らは、LAST_VALUEためのU-SQLのドキュメントは言っていないはずですので、検証が必要)ヌルを無視します。これにより、WHENなどの条件付き動作のエミュレーションが可能になります。 MAX/MINと適切なデフォルトで同様の動作を得ることができます。

つまり、入力データと期待される結果を詳細に指定する必要があり、ソリューションが変更される可能性があります。すなわち、異常なデータシーケンスが発生する可能性がありますし、彼らがしなければどのような動作が期待される(または少なくとも簡略化のために許容される):

  1. E1、E1、E2を - コードでは、以前のE1に
  2. E1、E2を無視する上、e2 - 上記のコードは同じ値の2つの値を計算する
  3. e1、e1、e2、e2 - 上記のコードではケース2と同じ入れ子は認識されません。
  4. e2 - 上記のコードはクラッシュDateTime.MinValueを使用して結果が得られます。

などいくつかの複雑な点では、おそらくREDUCE ALLを介してカスタムレデューサーに延期する必要があります(これが最後の手段です)が、処理できるデータのサイズを制限します。

+0

あなたのコメントをありがとう、Nabeel!しかし、正直なところ、DataLake Analyticsを完全に廃止し、必要な分析にSQL Serverのメモリ最適化テーブルを使用しました。構造化されたデータを頻繁に計算する必要があり、これがT-SQLが完全にうまくいくものです。私がデータ・レイク・アナリティクスを理解する限り、構造化されていないものを組み込み、あまり頻繁ではないバッチ処理をしたい場合は、より適しています。 –

+0

笑あなたのデータ量はかなり少ないと思います。がんばろう! – wBob