Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 它不在范围内解析_Scala_Apache Spark_Implicit - Fatal编程技术网

Scala 它不在范围内解析

Scala 它不在范围内解析,scala,apache-spark,implicit,Scala,Apache Spark,Implicit,我有一些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"

我有一些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.\u
,方法
===
停止解析
value===不是org.apache.spark.sql.Dataset的成员

因此,出于某种原因,
导入sqlContext.implicits.\u
在传递函数参数时不起作用。我的问题是:

  • 为什么隐式导入停止工作
  • 我该怎么做才能使导入工作并且仍然使用函数参数

  • 大多数情况下,问题不在于隐式,而在于类型不匹配(隐式对类型非常敏感)

    Unit
    a(Unit)
    中,抽象类
    Unit的
    b(Unit)
    。它没有类型
    Unit
    (它有类型
    Unit.type
    )。它是
    ()
    类型为
    单位的

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

    您也不能编写
    a(“prop_a1”)
    b(“prob_b1”)
    ,因为
    a
    b
    是来自
    单元的函数,您不能将它们应用于
    字符串

    所以尽管

    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[…]
    是无参数函数的类型

    或者你可以用参数来写

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