为什么隐式 class 中的函数不可用?
Why are functions in an implicit class not available?
我正在尝试自学 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))
^
我已经从其他地方(我知道它有效的地方)逐字复制了代码,所以我不知道为什么它不起作用。为什么我的隐式 class 中定义的函数不能用作 DataFrame
上的函数?
(问题已编辑,答案已过时,稍后可能会编辑)
这里是:
val groupBy = Seq('a','b')
生成 Seq[Char]
,而不是 Seq[String]
.. 由于 DataFrame
上没有方法 featuresGroup1(s: Seq[Char], d: LocalDate)
,scalac 将尝试找到到 [=35 的隐式转换=] 有这个方法。然而,只有
def featuresGroup1(groupBy: Seq[String], asAt: LocalDate): DataFrame
所以 Seq[Char]
和 Seq[String]
不适合在一起,编译器甚至不会报告
wrong parameter types for method featuresGroup1
expected: Seq[String]
received: Seq[Char]
因为它根本看不出与此方法有任何联系。
改用Seq("a", "b")
。
您似乎需要将 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}
}
我正在尝试自学 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))
^
我已经从其他地方(我知道它有效的地方)逐字复制了代码,所以我不知道为什么它不起作用。为什么我的隐式 class 中定义的函数不能用作 DataFrame
上的函数?
(问题已编辑,答案已过时,稍后可能会编辑)
这里是:
val groupBy = Seq('a','b')
生成 Seq[Char]
,而不是 Seq[String]
.. 由于 DataFrame
上没有方法 featuresGroup1(s: Seq[Char], d: LocalDate)
,scalac 将尝试找到到 [=35 的隐式转换=] 有这个方法。然而,只有
def featuresGroup1(groupBy: Seq[String], asAt: LocalDate): DataFrame
所以 Seq[Char]
和 Seq[String]
不适合在一起,编译器甚至不会报告
wrong parameter types for method
featuresGroup1
expected: Seq[String] received: Seq[Char]
因为它根本看不出与此方法有任何联系。
改用Seq("a", "b")
。
您似乎需要将 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}
}