Spark 2.x No Encoder found for org.apache.spark.sql.Row

4380 ワード

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をカスタマイズする必要があります.
エラーコード
		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