Kotlin和Spark - SAM问题

时间:2016-04-17 18:09:14

标签: apache-spark kotlin

也许我正在做一些不太受支持的事情,但我真的想用Kotlin来学习Apache Spark with this book

这是我正在尝试运行的Scala代码示例。 flatMap()接受FlatMapFunction SAM类型:

val conf = new SparkConf().setAppName("wordCount")
val sc = new SparkContext(conf)
val input = sc.textFile(inputFile)
val words = input.flatMap(line => line.split(" "))

我试图在Kotlin做这件事。但它在第四行有一个编译问题:

val conf = SparkConf().setMaster("local").setAppName("Line Counter")
val sc = SparkContext(conf)
val input = sc.textFile("C:\\spark_workspace\\myfile.txt",1)
val words = input.flatMap{ s:String -> s.split(" ") } //ERROR

当我将鼠标悬停在它上面时,我收到了编译错误:

我做了什么不合理或不支持的事情?我没有看到任何关于使用lambdas自动完成的建议:(

2 个答案:

答案 0 :(得分:3)

尽管问题已解决,但我想提供一些有关编译问题原因的信息。在此示例中,input的类型为RDD,其flatMap()方法接受应返回TraversableOnce[U]的lambda。由于Scala拥有自己的集合框架,因此Java集合类型无法转换为TraversableOnce

此外,我不太确定Scala Function是真正的SAM。据我所见,Kotlin并没有提供用lambda替换Function个实例。

答案 1 :(得分:2)

啊,我想通了。我知道有一种方法,因为Spark支持Java和Scala。此特定问题的关键是使用JavaSparkContext而不是基于Scala的SparkContext

出于某种原因,Scala和Kotlin并不总是与SAM转换相处。但Java和Kotlin确实......

fun main(args: Array<String>) {

    val conf = SparkConf().setMaster("local").setAppName("Line Counter")
    val sc = JavaSparkContext(conf)
    val input = sc.textFile("C:\\spark_workspace\\myfile.txt",1)
    val words = input.flatMap { it.split(" ") }

}