Scala 不使用SparkSession实例导入隐式转换
我的Spark代码被这样的代码弄得乱七八糟Scala 不使用SparkSession实例导入隐式转换,scala,apache-spark,implicits,Scala,Apache Spark,Implicits,我的Spark代码被这样的代码弄得乱七八糟 object Transformations { def selectI(df:DataFrame) : DataFrame = { // needed to use $ to generate ColumnName import df.sparkSession.implicits._ df.select($"i") } } 或者 object Transformations { def se
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")
}
}
这个问题有一个优雅的解决方案吗?我对隐式的使用不仅限于$
,还包括编码器
,.toDF()
等
我真的不明白为什么我们需要一个SparkSession实例来导入这些隐式转换。我宁愿做像这样的事情
因为每个数据集
都存在于特定的SparkSession
范围内,并且单个Spark应用程序可以有多个活动的SparkSession
从理论上讲,SparkSession.implicits.\u
中的一些可以与会话实例分开存在,如:
import org.apache.spark.sql.implicits._ // For let's say `$` or `Encoders`
import org.apache.spark.sql.SparkSession.builder.getOrCreate.implicits._ // For toDF
但是它会对用户代码产生重大影响。我要补充的是,
SQLImplicits
的唯一抽象成员是SQLContext
的一个实例,因此即使对于不严格依赖as-specificsqlcontenttxt
的implicits,也确实没有可行的解决方法。否则,答案很好。