说你有这个:
// 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
上的自定义类型?