4

ソースから変換するすべての行に一意の GUID が必要です。
以下はサンプルスクリプトです。コード Guid.NewGuid() は、すべての行に対して常に同じ値を返します

@Person =
    EXTRACT SourceId          int,
            AreaCode          string,
            AreaDetail         string,
            City        string
    FROM "/Staging/Person"
    USING Extractors.Tsv(nullEscape:"#NULL#");

@rs1 =
    SELECT 
    Guid.NewGuid() AS PersonId,
    AreaCode,
    AreaDetail,
    City    
    FROM @Person;

OUTPUT @rs1   
    TO "/Datamart/DimUser.tsv"
      USING Outputters.Tsv(quoting:false, dateTimeFormat:null);
4

3 に答える 3

7

Guid.NewGuid()U-SQL は宣言型言語であるため、またはなどの既知の非決定論的関数をDateTime.Nowスクリプトごとに 1 つの値にスナップショットすることに注意してください。

このような関数を C# 関数にラップすることで回避できますが、スクリプトを非決定論的にすることになるため、この方法はお勧めしません。再現可能な結果を​​生み出します!

では、どうすれば一意の番号を提供できますか?

オプションは次のとおりです。

  1. データ生成を変更できる場合は、外部データに既にある値を追加します。
  2. Skolemization: キー属性を組み合わせて一意の値にする決定論的式を記述します。
  3. 読み取ったデータに対して使用ROW_NUMBER() OVER ()します。一意性を保証する必要があるデータが既にある場合は、要件に応じて、ジョブが実行される時間の刻みを追加するか、既存の最大値を取得するか、十分な間隔のバンプを取得します。

上記のように、U-SQL はスクリプトの呼び出しごとに 1 回評価されるため、タイム ティック プラスROW_NUBER()を使用して、スクリプトを実行するたびに各行の ID が一意であることを確認するサンプルを次に示します。DateTime.Now

@data =
SELECT *
FROM (VALUES
      ( "John", "Doe" ),
      ( "Paul", "Miller" ),
      ( "Tracy", "Smith" ),
      ( "Jane", "Doe")
     ) AS T(firstname, lastname);

@res = 
SELECT DateTime.Now.Ticks+ROW_NUMBER() OVER () AS id, 
       firstname, lastname
FROM @data;

OUTPUT @res
TO "/output/data.csv"
USING Outputters.Csv();
于 2016-08-15T23:24:14.277 に答える