使用 Java 类的 Spark Scala 数据集
Posted
技术标签:
【中文标题】使用 Java 类的 Spark Scala 数据集【英文标题】:Spark Scala Datasets using Java Classes 【发布时间】:2019-07-31 20:00:28 【问题描述】:我正在使用 Scala 绑定创建一个 Spark 应用程序。但是我的一些模型(类)是用 Java 编写的。当我尝试基于 Scala 案例类创建数据集时,它工作正常,并且当我执行 show()
时所有列都可见。但是,当我基于 Java 类创建数据集时,所有列都打包在一个名为 value
的列中。
Scala 案例类示例:
case class Person(name: String, age: Int)
执行:
sqlContext.createDataset(Seq(Person("abcd", 10))).show()
输出:
name | age
abcd | 10
Java 类示例:
class Person
public String name;
public int age;
public Person (String name, int age)
this.name = name;
this.age = age;
执行:
sqlContext.createDataset(Seq(Person("abcd", 10))).show()
输出:
value
[01 00 63 6F 6D 2...]
难道我们不应该使用 Java 类作为 Spark Scala 应用程序的模型吗?我们如何解决这个问题?
【问题讨论】:
【参考方案1】:您可以使用 Java 类来创建数据集,但您需要为该类显式定义 bean(就像在 java 中那样工作)。此外,您需要定义 getter/setter 方法来定义 bean,并且您的类定义应该有 public 关键字(spark 抱怨一些编译错误)。希望它对你有用。
类
public class Person
private String name;
private int age;
public Person (String name, int age)
this.name = name;
this.age = age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
执行
implicit val personEncoder = Encoders.bean(classOf[Person])
sql.createDataset(Seq(new Person("abcd", 10))).show()
结果
+---+----+
|age|name|
+---+----+
| 10|abcd|
+---+----+
【讨论】:
以上是关于使用 Java 类的 Spark Scala 数据集的主要内容,如果未能解决你的问题,请参考以下文章