【问题标题】:Spark Scala Datasets using Java Classes使用 Java 类的 Spark Scala 数据集
【发布时间】: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 应用程序的模型吗?我们如何解决这个问题?

【问题讨论】:

    标签: scala apache-spark hadoop apache-spark-sql apache-spark-dataset


    【解决方案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|
    +---+----+
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2017-11-24
      • 2019-07-05
      • 2022-09-22
      • 1970-01-01
      相关资源
      最近更新 更多