あなたがこれを持っているとしましょう(カスタムタイプのエンコードの解決策はこのスレッドからもたらされます):
// 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|
+---+---+
更新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
型について知っておくとよいですが、それでもカスタム型をデコードできません)