假设你有这个(编码自定义类型的解决方案来自这个线程):
// 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")))
什么时候做一个ds.show
, I got:
+--------------------+
| 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|
+---+---+
UPDATE1
显示内容并不是最大的问题,更重要的是它可能会导致处理数据集时出现问题,请考虑以下示例:
// 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
- 编码类型无法执行类似操作joinWith
方便吗?
我们如何处理自定义类型Dataset
then?
如果我们在编码后无法对其进行处理,那么这样做还有什么意义呢?kryo
自定义类型的编码解决方案?!
(下面由 @jacek 提供的解决方案很值得了解case class
输入,但仍然无法解码定制类型)