통사론
Function.ScalarVector(scalarFunctionType as type, vectorFunction as function) as function
소개
단일 인수 행을 사용하여 scalarFunctionType 호출하고 단일 출력을 반환하는 vectorFunction 형식의 스칼라 함수를 반환합니다. 또한, 스칼라 함수가 Table.AddColumn와 같은 입력 테이블의 각 행에 반복적으로 적용되는 대신, 모든 입력에 대해 vectorFunction이 한 번만 적용됩니다.
vectorFunction에는 열 이름과 위치가 scalarFunctionType의 매개변수와 일치하는 테이블이 전달됩니다. 이 테이블의 각 행에는 스칼라 함수에 대한 한 번의 호출에 대한 인수와 scalarFunctionType매개 변수에 해당하는 열이 포함됩니다.
vectorFunction 입력 테이블과 동일한 길이의 목록을 반환해야 하며, 각 위치의 항목은 동일한 위치의 입력 행에서 스칼라 함수를 평가하는 것과 동일한 결과여야 합니다.
입력 테이블이 스트리밍 방식으로 들어올 것으로 예상되므로, vectorFunction은 입력이 들어오는 대로 출력을 스트리밍 형태로 내보내야 하며, 동시에 한 번에 하나의 입력 청크만 처리합니다. 특히 vectorFunction 입력 테이블을 두 번 이상 열거해서는 안됩니다.
예제 1
입력을 100개의 배치로 처리하여 입력 테이블의 두 열을 곱합니다.
사용법
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}
}
)