Condividi tramite


Function.ScalarVector

Sintassi

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

Informazioni

Restituisce una funzione scalare di tipo scalarFunctionType che chiama vectorFunction con una singola riga di argomenti e restituisce il relativo output singolo. Inoltre, quando la funzione scalare viene applicata ripetutamente per ogni riga di una tabella di input, ad esempio in Table.AddColumn, invece vectorFunction verrà applicata una volta per tutti gli input.

A vectorFunction verrà passata una tabella le cui colonne corrispondono al nome e alla posizione dei parametri di scalarFunctionType. Ogni riga di questa tabella contiene gli argomenti per una chiamata alla funzione scalare, in cui le colonne corrispondono ai parametri di scalarFunctionType.

vectorFunction deve restituire un elenco della stessa lunghezza della tabella di input, il cui elemento in ogni posizione deve essere uguale al risultato della valutazione della funzione scalare nella riga di input della stessa posizione.

È previsto lo streaming della tabella di input, di conseguenza vectorFunction dovrebbe eseguire lo streaming dell'output non appena riceve l'input e usare quindi un solo blocco di input alla volta. In particolare, vectorFunction non deve enumerare la relativa tabella di input più di una volta.

Esempio 1

Moltiplicare due colonne della tabella di input elaborando gli input in batch di 100.

Utilizzo

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

Risultato


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

Esempio 2

Calcolare i punteggi dei test in batch di due e popolare un campo ID batch che può essere usato per verificare che l'invio in batch funzioni come previsto.

Utilizzo

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

Risultato

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