导入不带SparkSession实例的隐式转换

Rap*_*oth 4 scala implicits apache-spark

我的Spark代码充满了这样的代码

object Transformations {   
  def selectI(df:DataFrame) : DataFrame = {    
    // needed to use $ to generate ColumnName
    import df.sparkSession.implicits._

    df.select($"i")
  }
}
Run Code Online (Sandbox Code Playgroud)

或者

object Transformations {   
  def selectI(df:DataFrame)(implicit spark:SparkSession) : DataFrame = {    
    // needed to use $ to generate ColumnName
    import sparkSession.implicits._

    df.select($"i")
  }
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么我们需要一个实例SparkSession来导入这些隐式转换。我想做这样的事情:

object Transformations {  
  import org.apache.spark.sql.SQLImplicits._ // does not work

  def selectI(df:DataFrame) : DataFrame = {    
    df.select($"i")
  }
}
Run Code Online (Sandbox Code Playgroud)

有解决这个问题的优雅方法吗?我使用implicits的并不限于$而且Encoders.toDF()等等。

小智 6

我真的不明白为什么我们只需要一个SparkSession实例来导入这些隐式转换。我想做类似的事情

因为每一个都Dataset存在于特定范围内,SparkSession并且单个Spark应用程序可以具有多个active 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
Run Code Online (Sandbox Code Playgroud)

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