Spark Java Encoders.bean не удается преобразовать в определенный класс Scala - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть Java-код для преобразования JavaRDD в Dataset и сохранения его в HDFS:

Dataset<User> userDataset = sqlContext.createDataset(userRdd.rdd(), Encoders.bean(User.class));
userDataset.write.json("some_path");

User класс определен на языке Scala:

case class User(val name: Name, val address: Seq[Address]) extends Serializable

case class Name(firstName: String, lastName: Option[String])

case class Address(address: String)

Код соответствует и выполняется успешно, файл сохраняется в HDFS, а класс User в выходном файле имеет пустую схему:

val users = spark.read.json("some_path")
users.count // 100,000 which is same as "userRdd"
users.printSchema // users: org.apache.spark.sql.DataFrame = []

Почему Encoders.bean не работает в этом случае?

1 Ответ

0 голосов
/ 26 сентября 2019

Encoders.bean не поддерживает класс падежа Scala, Encoders.product поддерживает это.Encoders.product принимает TypeTag в качестве параметра, в то время как инициализация TypeTag невозможна в Java.Я создал объект Scala для предоставления TypeTag:

import scala.reflect.runtime.universe._

object MyTypeTags {
  val UserTypeTag: TypeTag[User] = typeTag[User]
}

Затем в коде Java: Dataset<User> userDataset = sqlContext.createDataset(userRdd.rdd(), Encoders.product(MyTypeTags.UserTypeTag()));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...