在没有 SparkSession 实例的情况下导入隐式转换

import implicit conversions without instance of SparkSession

我的 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()

I don't really understand why we need an instance of SparkSession just to import these implicit conversions. I would rather like to do something like

因为每个 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

但这会对用户代码产生重大影响。