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

时间:2018-06-22 08:59:29

标签: scala apache-spark implicits

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

1 个答案:

答案 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

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