Почему функции в неявном классе недоступны?

Я пытаюсь научить себя Scala и использую IntelliJ IDEA в качестве своей IDE. Я запустил оболочку IntelliJ sbt, запустил 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))
                                                            ^

Я скопировал код в значительной степени дословно из других мест (где я знаю, что он работает), поэтому я не знаю, почему это не работает. Почему функции, определенные в моем неявном классе, не доступны как функции на DataFrame?

2 ответа

Решение

Кажется, вам нужно переименовать 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}
  }

(Вопрос отредактирован, ответ устарел, возможно, отредактирую позже)

Это здесь:

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

производит Seq[Char]не Seq[String].. Так как нет метода featuresGroup1(s: Seq[Char], d: LocalDate) на DataFrameСкалак попытается найти неявное преобразование в класс, который имеет этот метод. Однако есть только

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

так Seq[Char] а также Seq[String] не подходят друг другу, и компилятор даже не сообщает что-то вроде

неправильные типы параметров для метода featuresGroup1 ожидается: Seq[String] получил: Seq[Char]

потому что он не видит никакой связи с этим методом вообще.

использование Seq("a", "b") вместо.

Другие вопросы по тегам