次の方法で共有


Function.ScalarVector

構文

Function.ScalarVector(scalarFunctionType as type, vectorFunction as function) as function

バージョン情報

引数の 1 行でscalarFunctionTypeを呼び出し、その 1 つの出力を返すvectorFunction型のスカラー関数を返します。 さらに、 Table.AddColumnなど、入力テーブルの各行にスカラー関数を繰り返し適用すると、 vectorFunction はすべての入力に対して 1 回適用されます。

vectorFunction には、名前と位置がscalarFunctionTypeのパラメーターと一致する列を持つテーブルが渡されます。 このテーブルの各行には、スカラー関数の 1 回の呼び出しの引数と、 scalarFunctionTypeのパラメーターに対応する列が含まれています。

vectorFunction は、入力テーブルと同じ長さのリストを返す必要があります。各位置の項目は、同じ位置の入力行でスカラー関数を評価する場合と同じ結果である必要があります。

入力テーブルはストリームインされることが予想されるため、 vectorFunction は入力が入ってくると出力をストリーミングすることが期待され、一度に 1 つの入力チャンクでのみ動作します。 特に、 vectorFunction は入力テーブルを複数回列挙してはなりません。

例 1

入力を 100 のバッチで処理することで、入力テーブルの 2 つの列を乗算します。

使用方法

let
    Compute.ScoreScalar = (left, right) => left * right,
    // When Function.ScalarVector batching kicks in, we'll receive all
    // of the inputs for the entire table here at once.
    Compute.ScoreVector = (input) => let
        chunks = Table.Split(input, 100),
        scoreChunk = (chunk) => Table.TransformRows(chunk, each Compute.ScoreScalar([left], [right]))
      in
        List.Combine(List.Transform(chunks, scoreChunk)),
    Compute.Score = Function.ScalarVector(
        type function (left as number, right as number) as number, 
        Compute.ScoreVector
    ),
    Final = Table.AddColumn(
        Table.FromRecords({
            [a = 1, b = 2],
            [a = 3, b = 4]
        }),
        "Result",
        each Compute.Score([a], [b])
    )
in
    Final

アウトプット


Table.FromRecords({
    [a = 1, b = 2, Result = 2],
    [a = 3, b = 4, Result = 12]
})

例 2

2 つのバッチでテスト スコアを計算し、バッチ処理が期待どおりに動作していることを確認するために使用できるバッチ ID フィールドを設定します。

使用方法

let
  _GradeTest = (right, total) => Number.Round(right / total, 2),
  _GradeTests = (inputs as table) as list => let
    batches = Table.Split(inputs, 2),
    gradeBatch = (batch as table) as list =>
      let
        batchId = Text.NewGuid()
      in
        Table.TransformRows(batch, each [Grade = _GradeTest([right], [total]), BatchId = batchId])
  in
    List.Combine(List.Transform(batches, gradeBatch)),
  GradeTest = Function.ScalarVector(type function (right as number, total as number) as number, _GradeTests),
  Tests = #table(type table [Test Name = text, Right = number, Total = number],
    {
      {"Quiz 1", 3, 4},
      {"Test 1", 17, 22},
      {"Quiz 2", 10, 10}
    }),
  // To break batching, replace [Right] with {[Right]}{0}.
  TestsWithGrades = Table.AddColumn(Tests, "Grade Info", each GradeTest([Right], [Total]), type record),
  // To verify batching, also expand BatchId.
  Final = Table.ExpandRecordColumn(TestsWithGrades, "Grade Info", {"Grade"})
in
  Final

アウトプット

#table(
    type table [Test Name = text, Right = number, Total = number, Grade = number],
    {
      {"Quiz 1", 3, 4, 0.75},
      {"Test 1", 17, 22, 0.77},
      {"Quiz 2", 10, 10, 1}
    }
)