如何在Spark数据集中显示或操作由Kryo编码的对象?

问题描述

说你有这个:

// 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时,我得到:

+--------------------+
|               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,new MyObj(6,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上的自定义类型?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)