假设你有这个(编码自定义类型的解决方案来自这个线程):
// assume we handle custom type
class MyObj(val i: Int, val j: String)
implicit val myObjEncoder = org.apache.spark.sql.Encoders.kryo[MyObj]
val ds = spark.createDataset(Seq(new MyObj(1, "a"),new MyObj(2, "b"),new MyObj(3, "c")))
当做 a 时ds.show
,我得到:
+--------------------+
| value|
+--------------------+
|[01 00 24 6C 69 6...|
|[01 00 24 6C 69 6...|
|[01 00 24 6C 69 6...|
+--------------------+
我知道这是因为内容被编码为内部 Spark SQL 二进制表示。但是我怎样才能像这样显示解码后的内容呢?
+---+---+
| _1| _2|
+---+---+
| 1| a|
| 2| b|
| 3| c|
+---+---+
更新1
显示内容不是最大的问题,更重要的是它在处理数据集时可能会导致问题,考虑这个例子:
// continue with the above code
val ds2 = spark.createDataset(Seq(new MyObj(2, "a"),new MyObj(6, "b"),new MyObj(5, "c")))
ds.joinWith(ds2, ds("i") === ds2("i"), "inner")
// this gives a Runtime error: org.apache.spark.sql.AnalysisException: Cannot resolve column name "i" among (value);
这是否意味着,kryo
-encoded 类型不能joinWith
方便地进行操作?
那么我们如何处理自定义类型
Dataset
呢?
如果我们在编码后无法处理它,那么这种kryo
自定义类型的编码解决方案有什么意义?!
(下面@jacek 提供的解决方案很好了解case class
类型,但它仍然无法解码自定义类型)