spark表示它没有在范围内解析

gwo2fgha  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(421)

我有一些scala/spark代码如下:

import sqlContext.implicits._

  val join: (Dataset[MyCaseClassA], Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
    a.joinWith(b,
      a("prop_a1") === b("prob_b1"),
      "left"
    ) //more code...

这工作很好,编译和一切。但是假设我想做一些函数式编程,所以我将整个过程重构为:

import sqlContext.implicits._

  val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
     a(Unit).joinWith(b(Unit),
        a("prop_a1") === b("prob_b1"),
        "left"
     ) //more code...

好吧,这样就可以了。然而,最终的结果是intellij会立即变灰 import sqlContext.implicits._ ,以及方法 === 停止解析 value === is not a member of org.apache.spark.sql.Dataset .
所以出于某种原因 import sqlContext.implicits._ 只是在传递函数参数时不起作用。我的问题是:
为什么隐式导入停止工作?
我该怎么做才能使导入工作并且仍然使用函数参数?

ifmq2ha2

ifmq2ha21#

最重要的不是隐式,而是类型不匹配(隐式对类型非常敏感)。 Unita(Unit) , b(Unit) 是抽象类的伴生对象 Unit . 它没有类型 Unit (它有类型 Unit.type ). 是的 () 有类型的 Unit . a(Unit) , b(Unit) 编译只是因为在scala中任何类型(例如。 Unit.type )可以转化为 Unit .
你也不会写字 a("prop_a1") , b("prob_b1") 因为 a , b 函数来自 Unit ,您不能将它们应用于 String .
所以尽管

val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
  a(Unit).joinWith(b(Unit),
    a(Unit)("prop_a1") === b(Unit)("prob_b1"),
    "left"
  ) //more code...

编译(类似偶数)

val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
  a(1).joinWith(b("A"),
    a(true)("prop_a1") === b(???)("prob_b1"),
    "left"
  ) //more code...

你的意思是

val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
  a(()).joinWith(b(()),
    a(())("prop_a1") === b(())("prob_b1"),
    "left"
  ) //more code...

也有点奇怪接受 Unit ,通常 Unit 已返回。
你可以写

val join: (() => Dataset[MyCaseClassA], () => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
  a().joinWith(b(),
    a()("prop_a1") === b()("prob_b1"),
    "left"
  ) //more code...

在这里 () => ... 又称作 Function0[...] 是无参数函数的类型。
或者可以使用按名称参数编写

val join: (=> Dataset[MyCaseClassA], => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
  a.joinWith(b,
    a("prop_a1") === b("prob_b1"),
    "left"
  ) //more code...

相关问题