3

あなたがこれを持っているとしましょう(カスタムタイプのエンコードの解決策はこのスレッドからもたらされます):

// 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型について知っておくとよいですが、それでもカスタム型をデコードできません)

4

1 に答える 1