1

我正在尝试自学 Scala 并使用 IntelliJ IDEA 作为我的 IDE。我已经启动了 IntelliJ 的 sbt shell,运行console然后输入以下内容:

import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
import java.time.LocalDate
object DataFrameExtensions {
  implicit class DataFrameExtensions(df: DataFrame){
    def featuresGroup1(groupBy: Seq[String], asAt: LocalDate): DataFrame = {df}
    def featuresGroup2(groupBy: Seq[String], asAt: LocalDate): DataFrame = {df}
  }
}
import DataFrameExtensions._
val spark = SparkSession.builder().config(new SparkConf().setMaster("local[*]")).enableHiveSupport().getOrCreate()
import spark.implicits._
val df = Seq((8, "bat"),(64, "mouse"),(-27, "horse")).toDF("number", "word")
val groupBy = Seq("a","b")
val asAt = LocalDate.now()
val dataFrames = Seq(df.featuresGroup1(groupBy, asAt),df.featuresGroup2(groupBy, asAt))

它在最后一行失败:

scala> val dataFrames = Seq(df.featuresGroup1(groupBy, asAt),df.featuresGroup2(groupBy, asAt))
<console>:25: error: value featuresGroup1 is not a member of 
org.apache.spark.sql.DataFrame
       val dataFrames = Seq(df.featuresGroup1(groupBy, asAt),df.featuresGroup2(groupBy, asAt))
                               ^
<console>:25: error: value featuresGroup2 is not a member of org.apache.spark.sql.DataFrame
   val dataFrames = Seq(df.featuresGroup1(groupBy, asAt),df.featuresGroup2(groupBy, asAt))
                                                            ^

我已经从其他地方(我知道它可以工作)逐字复制了代码,所以我不知道为什么这不起作用。为什么我的隐式类中定义的函数不能作为 a 上的函数使用DataFrame

4

2 回答 2

4

看来您需要将 重命名implicit class DataFrameExtensions为不同的名称,因为有一个object名称相同。implicit class 我猜编译器在您使用时会感到困惑

import DataFrameExtensions._

我将它重命名为下面,它现在可以工作了

 implicit class FeatureGroupImplicits(df: DataFrame){
    def featuresGroup1(groupBy: Seq[String], asAt: LocalDate): DataFrame = {df}
    def featuresGroup2(groupBy: Seq[String], asAt: LocalDate): DataFrame = {df}
  }
于 2018-05-23T02:30:54.793 回答
1

(问题已编辑,答案已过时,以后可能会编辑)

这里:

val groupBy = Seq('a','b')

产生Seq[Char],而不是Seq[String].. 由于没有方法featuresGroup1(s: Seq[Char], d: LocalDate)on DataFrame,scalac 将尝试找到到具有此方法的类的隐式转换。然而,只有

def featuresGroup1(groupBy: Seq[String], asAt: LocalDate): DataFrame

所以不适合在一起,编译器甚至不报告类似的Seq[Char]东西Seq[String]

预期方法的错误参数类型featuresGroup1 :收到 Seq[String]:Seq[Char]

因为它根本看不到与此方法的任何联系。

改为使用Seq("a", "b")

于 2018-05-22T22:19:08.623 回答