我的Spark-Code充满了这样的代码
object Transformations {
def selectI(df:DataFrame) : DataFrame = {
// needed to use $ to generate ColumnName
import df.sparkSession.implicits._
df.select($"i")
}
}
或者
object Transformations {
def selectI(df:DataFrame)(implicit spark:SparkSession) : DataFrame = {
// needed to use $ to generate ColumnName
import sparkSession.implicits._
df.select($"i")
}
}
我真的不明白为什么我们只需要导入SparkSession
实例就可以导入这些隐式转换。我想做类似的事情:
object Transformations {
import org.apache.spark.sql.SQLImplicits._ // does not work
def selectI(df:DataFrame) : DataFrame = {
df.select($"i")
}
}
是否有解决此问题的简便方法?我对隐式的使用不仅限于$
,还包括Encoders
,.toDF()
等。
答案 0 :(得分:6)
我真的不明白为什么我们只需要一个SparkSession实例来导入这些隐式转换。我想做
因为每个Dataset
都存在于特定的SparkSession
范围内,并且单个Spark应用程序可以具有多个活动的SparkSession
。
理论上,某些SparkSession.implicits._
可以与会话实例分开存在,例如:
import org.apache.spark.sql.implicits._ // For let's say `$` or `Encoders`
import org.apache.spark.sql.SparkSession.builder.getOrCreate.implicits._ // For toDF
但这会对用户代码产生重大影响。