在没有 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
但这会对用户代码产生重大影响。
我的 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
但这会对用户代码产生重大影响。