返回参数列表

时间:2018-06-28 12:47:33

标签: scala apache-spark

我正在阅读Spark的源代码,并且不确定我是否了解这一行readFunction: (PartitionedFile) => InputPartitionReader[T]

问题:

  1. 因此我们可以将方法readFunction作为参数传递给案例类?
  2. 这里有术语吗?
  3. 此语法是否有特殊动机?

    case class FileInputPartition[T](
    file: FilePartition,
    readFunction: (PartitionedFile) => InputPartitionReader[T],<-- This line
    ignoreCorruptFiles: Boolean = false,
    ignoreMissingFiles: Boolean = false)
    extends InputPartition[T] {
    override def createPartitionReader(): InputPartitionReader[T] = {
    val taskContext = TaskContext.get()
    val iter = file.files.iterator.map(f => PartitionedFileReader(f, 
    readFunction(f)))
    FileInputPartitionReader(taskContext, iter, ignoreCorruptFiles, 
    ignoreMissingFiles)
    }
    
    override def preferredLocations(): Array[String] = {
    FilePartitionUtil.getPreferredLocations(file)
    }
    }
    

1 个答案:

答案 0 :(得分:3)

在Scala中,函数为first class objects。这意味着:

  

该语言支持将函数作为参数传递给其他函数,将其作为其他函数的值返回,并将其分配给变量或存储在数据结构中

在这种情况下,构造函数可以使用Function1[PartitionedFile, InputPartitionReader[T]]。这里没有什么特别寻常的地方,在Scala中,函数作为参数无处不在,其中以collection API最为突出。

实际上,这里是如何使用此功能的-导致map超出集合:

file.files.iterator.map(f => PartitionedFileReader(f, readFunction(f)))

这种用法在很大程度上解释了动机。