使用 Java 类 的 Spark Scala 数据集

Spark Scala Datasets using Java Classes

我正在使用 Scala 绑定创建一个 Spark 应用程序。但是我的一些模型 (类) 是用 Java 编写的。当我尝试基于 Scala Case Class 创建数据集时,它工作正常并且当我这样做时所有列都可见 show()。但是当我基于 Java Class 创建数据集时,所有列都打包在一个名为 value 的列中。

Scala 案例 Class 示例:

case class Person(name: String, age: Int)

执行:

sqlContext.createDataset(Seq(Person("abcd", 10))).show()

输出:

name | age

abcd | 10

Java Class 示例:

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 应用程序的模型吗?我们如何解决这个问题?

您可以使用 Java classes 来创建数据集,但您需要为 class 明确定义 bean(与 java 中的工作方式类似)。此外,您需要定义 getter/setter 方法来定义 bean,并且您的 class 定义应该具有 public 关键字(spark 抱怨一些编译错误)。希望它对你有用。

Class

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|
+---+----+