Freigeben über


Function.ScalarVector

Syntax

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

About

Gibt eine skalare Funktion vom Typ scalarFunctionType zurück, die mit einer einzelnen Zeile mit Argumenten vectorFunction aufgerufen wird, und gibt die einzelne Ausgabe zurück. Wenn die skalare Funktion wiederholt auf jede Zeile einer Eingabetabelle angewendet wird, z. B. in Table.AddColumn, wird stattdessen vectorFunction einmal für alle Eingaben angewendet.

vectorFunction wird eine Tabelle übergeben, deren Spalten in Namen und Position den Parametern von scalarFunctionType entsprechen. Jede Zeile dieser Tabelle enthält die Argumente für einen Aufruf der Skalarfunktion mit den Spalten, die den Parametern entsprechen scalarFunctionType.

vectorFunction muss eine Liste derselben Länge wie die Eingabetabelle zurückgeben, deren Element an jeder Position dasselbe Ergebnis sein muss wie die Auswertung der Skalarfunktion in der Eingabezeile derselben Position.

Es wird erwartet, dass die Eingabetabelle gestreamt wird. Daher vectorFunction wird erwartet, dass die Ausgabe beim Eingang gestreamt wird und nur mit einem Teil der Eingabe gleichzeitig funktioniert. Insbesondere vectorFunction darf die Eingabetabelle nicht mehr als einmal durchlaufen.

Beispiel 1

Multiplizieren Sie zwei Spalten der Eingabetabelle, indem Sie die Eingaben in Batches von 100 verarbeiten.

Verwendung

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

Output


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

Beispiel 2

Berechnen Sie Testergebnisse in Zweiergruppen und füllen Sie ein Batch-ID-Feld aus, das verwendet werden kann, um zu überprüfen, ob die Batchverarbeitung wie erwartet funktioniert.

Verwendung

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

Output

#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}
    }
)