Scala 不使用SparkSession实例导入隐式转换

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

我的Spark代码被这样的代码弄得乱七八糟

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-specific
sqlcontenttxt
的implicits,也确实没有可行的解决方法。否则,答案很好。