如何在Spark scala.Symbol
中启用Dataset
s的编码?
以下小例子:
import org.apache.spark.sql.SparkSession
object DatasetTest extends App {
val spark: SparkSession = SparkSession
.builder()
.master("local[*]")
.getOrCreate()
import spark.implicits._
case class RowType(symbol: Symbol, string: String)
val key = Symbol("123")
val ds1 = Seq(RowType(key, "some data")).toDS
val ds2 = Seq(RowType(key, "other data")).toDS
ds1.joinWith(ds2, ds1.col("symbol") === ds2.col("symbol")).show
}
在运行时会失败:
Exception in thread "main" java.lang.UnsupportedOperationException: No Encoder found for Symbol
- field (class: "scala.Symbol", name: "symbol")
- root class: "DatasetTest.RowType"
我所有包含隐式编码器的尝试都失败了。
例如,在使用Kryo时,创建了数据集,但joinWith
将无法找到“符号”列。 (使用Kryo时似乎火花不能破坏类型)
任何提示?
请注意,这个问题比How to store custom objects in Dataset?更具体,并期待更具体的答案。