scala - 在没有 RDD 的数据帧列值提取中定义隐式/显式编码的最佳实践
问题描述
我正在尝试在没有 RDD 映射 api 的集合中获取列数据(使用纯数据框方式)
object CommonObject{
def doSomething(...){
.......
val releaseDate = tableDF.where(tableDF("item") <=> "releaseDate").select("value").map(r => r.getString(0)).collect.toList.head
}
}
这一切都很好,除了 Spark 2.3 建议
No implicits found for parameter evidence$6: Encoder[String]
map
和之间collect
map(r => r.getString(0))(...).collect
我明白要添加
import spark.implicits._
在过程之前但是它需要一个spark session
实例
这很烦人,尤其是当方法中没有火花会话实例时。作为一个 Spark 新手,如何很好地解决上下文中的隐式编码参数?
解决方案
你总是可以SparkSession.builder.getOrCreate()
在你的方法中添加一个调用。Spark 会找到已经存在的 SparkSession 而不会创建新的,因此不会影响性能。然后,您可以导入适用于所有案例类的显式。这是添加编码的最简单方法。或者,可以使用Encoders
类添加显式编码器。
val spark = SparkSession.builder
.appName("name")
.master("local[2]")
.getOrCreate()
import spark.implicits._
另一种方法是从数据框中获取 SparkSessiondataframe.sparkSession
def dummy (df : DataFrame) = {
val spark = df.sparkSession
import spark.implicits._
}
推荐阅读
- javascript - 不使用 windows.print() 打印输入文本框的列表
- assembly - 如何将位范围读入寄存器?
- css - 内联块非替换元素的对齐框
- angular - DatePipe 在 Angular 6 中无法正常工作
- r - 将ggplot对象保存为环境中的图像作为对象/值
- android - 创建 Aar 如何限制我的应用程序仅访问该 aar
- python - New-> IndexError: 索引 3 超出轴 0 的范围,大小为 3
- android - LibGDX 样板代码 NullPointerException
- c# - 使用backgroudWorker C#时出现跨线程操作错误
- python - 如何随机生成变量名?