簡體   English   中英

使用 Java 類的 Spark Scala 數據集

[英]Spark Scala Datasets using Java Classes

我正在使用 Scala 綁定創建一個 Spark 應用程序。 但是我的一些模型(類)是用 Java 編寫的。 當我嘗試基於 Scala Case Class 創建數據集時,它工作正常,並且當我執行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 應用程序的模型嗎? 我們如何解決這個問題?

您可以使用 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|
+---+----+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM