Spark 2.x No Encoder found for org.apache.spark.sql.Row
Exception in thread “main” java.lang.UnsupportedOperationException: No Encoder found for org.apache.spark.sql.Row - field (class: “org.apache.spark.sql.Row”, name: “_2”) - root class: “scala.Tuple2”
例外原因:データセットに格納されているタイプのエンコーダが見つかりません.sparkをインポートする.implicitsは、基本タイプ(Int、Stringなど)と製品タイプ(caseクラス)をサポートします.シーケンス化された他のタイプのサポートは、将来のバージョンで追加されます.基本タイプはsparkに直接インポートできる.implicitsは暗黙的に変換され、他のタイプはEncoderをカスタマイズする必要があります.
エラーコード
ノーマルコード
例外原因:データセットに格納されているタイプのエンコーダが見つかりません.sparkをインポートする.implicitsは、基本タイプ(Int、Stringなど)と製品タイプ(caseクラス)をサポートします.シーケンス化された他のタイプのサポートは、将来のバージョンで追加されます.基本タイプはsparkに直接インポートできる.implicitsは暗黙的に変換され、他のタイプはEncoderをカスタマイズする必要があります.
エラーコード
import spark.implicits._
//ods DataFrame
val baseRdd: RDD[(List[String], Row)] = odsData.filter(TagsHandler.hasNeedOneUserId).map(row => {
// id
val allUserIds = TagsHandler.getCurrentRowAllUserId(row)
(allUserIds, row)
}).rdd
ノーマルコード
val encoder = Encoders.tuple(
ExpressionEncoder[List[String]],
RowEncoder(
odsData.schema
))
val baseRdd: RDD[(List[String], Row)] = odsData.filter(TagsHandler.hasNeedOneUserId).map(row => {
// id
val allUserIds = TagsHandler.getCurrentRowAllUserId(row)
(allUserIds, row)
})(encoder).rdd