Joh*_*ass 1 scala apache-spark
我是 Scala 的新手,我正在阅读这段代码。
我理解第一个val bucketizers是作为变量的函数,并val newCols称为bucketizers.
但是,我不明白为什么在bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))函数调用之后有一个括号bucketizers(idx)。我查了一些高级主题,包括闭包、高阶函数和链函数调用,但我认为我没有找到答案。
问题:这个括号叫什么?我们可以用另一种方式重写它吗?
代码:
val bucketizers: Seq[UserDefinedFunction] = seqOfSplits.zipWithIndex.map { case (splits, idx) =>
udf { (feature: Double) =>
Bucketizer.binarySearchForBuckets(splits, feature, keepInvalid)
}.withName(s"bucketizer_$idx")
}
val newCols = inputColumns.zipWithIndex.map { case (inputCol, idx) =>
bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))
}
Run Code Online (Sandbox Code Playgroud)
一步步:
bucketizers包含一个类型为 的序列Seq[UserDefinedFunction]。idx: Int,表达式
bucketizers(idx)是一个UserDefinedFunctionf是UserDefinedFunction,而且x是合适的参数,那么你可以调用传递函数x的参数如下:f(x)。bucketizers(idx)(x)与x = filteredDataset(inputCol).cast(DoubleType)这里再次将所有部分组合为 ASCII 艺术:
bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))
\______________/^\________________________________________/^
function | argument |
| |
open parens for argument close parens
Run Code Online (Sandbox Code Playgroud)
这是一个仅使用基本语法的玩具示例:
val inputColumns = List(
List(1, 2, 3, 4, 5, 6), // first "column"
List(4, 6, 5, 7, 12, 15) // second "column"
)
type UDF = Function[List[Int], List[Int]]
val bucketizers: Seq[UDF] = List(
_.map(_ * 42), // first "UDF"
_.map(_ % 3) // second "UDF"
)
println(bucketizers(0)(List(1, 100))) // 42, 4200
println(bucketizers(1)(List(1,2,3,4))) // 1,2,0,1
val modifiedTable = inputColumns.zipWithIndex.map{ case (col, idx) =>
bucketizers(idx)(col)
}
println(modifiedTable)
// Output:
// List(
// List(42, 84, 126, 168, 210, 252), // first column times 42
// List(1, 0, 2, 1, 0, 0) // second column modulo 3
// )
Run Code Online (Sandbox Code Playgroud)
在这里,我们声明了一个包含两列的“表”和一个函数列表。然后我们将每个函数应用到相应的列。