Почему функции в неявном классе недоступны?
Я пытаюсь научить себя 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")
вместо.