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

发布于 2022-09-06 23:51:48 字数 730 浏览 19 评论 0


    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 需要的方法类型 好像是不匹配的,不是吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦在夏天 2022-09-13 23:51:49

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

final def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): List[B]
仅一夜美梦 2022-09-13 23:51:48

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文