Spark 中 关于scala 语法理解的问题

settings
  • 482

    val lines: Dataset[String] = session.read.textFile("")
    val words: Dataset[String] = lines.flatMap(_.split(" "))
    
    上面lines是一个dataSet对象,flatMap方法是dataSet中定义的一个方法,上面两行代码在IDEA下没报错误。flatMap如下:
    
    
      def flatMap[U : Encoder](func: T => TraversableOnce[U]): Dataset[U] =
    mapPartitions(_.flatMap(func))
    
    
   
    

问题:
_.split(" ") 相当于一个函数,传入参数是String类型,返回类型是split的结果类型 Array[String],

而flatmap方法定义为接收 func: T => TraversableOnce[U] , 显然这里的T是String类型,
而 Array[String] 并不是TraversableOnce[U] 类型,因为Array 没有实现TraversableOnce 这个特质,

所以我的问题是: 为什么 我传入 _.split(" ") 这样一个函数 给flatMap,flatMap却没有报错??

简而言之就是我传入的方法 类型,和flatMap 需要的方法类型 好像是不匹配的,不是吗?

回复
阅读 2.9k
2 个回答
kafka
  • 1
新手上路,请多包涵

scala通过隐式转换默认调用了iterator 方法转换为一个可迭代的对象(Array(1,2,3).iterator)

flatMap需要一个实现了一交遍历接口的类型或返回这个类型的函数,_.split("")返回的是list, list也实现了TraversableOnce,所以类型是匹配的。

final def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): List[B]
宣传栏