【问题标题】:Spark implicits not resolving inside of scopeSpark 暗示不在范围内解析
【发布时间】:2020-12-23 03:49:34
【问题描述】:

我有一些看起来像这样的 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...

AFAIKT 这应该可以正常工作。然而,最终发生的事情是 IntelliJ 立即变灰 import sqlContext.implicits._,并且方法 === 停止使用 value === is not a member of org.apache.spark.sql.Dataset 解析。

因此,由于某种原因,import sqlContext.implicits._ 在传递函数参数时不起作用。我的问题是:

  1. 为什么隐式导入停止工作?
  2. 我可以做些什么来使导入工作并且仍然使用函数参数?

【问题讨论】:

    标签: scala apache-spark implicit


    【解决方案1】:

    主要不是隐式,而是类型不匹配(隐式对类型非常敏感)。

    Unit 在抽象类 Unita(Unit)b(Unit) is the companion object 中。它没有Unit 类型(它有Unit.type 类型)。 () 的类型为 Unit

    a(Unit), b(Unit) 编译只是因为在 Scala 中任何类型(例如 Unit.type)都可以转换为 Unit

    你也不能写a("prop_a1")b("prob_b1"),因为ab是来自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...
    

    这里的() => ... aka Function0[...] 是无参数函数的类型。

    或者您可以使用by-name 参数编写

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

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2010-09-09
      • 2012-04-20
      • 2014-07-09
      相关资源
      最近更新 更多