簡體   English   中英

如何將 Dataframe 轉換為數據集,具有父 class 的 object 引用作為另一個 ZA2F2ED4ADC98EBC2CBBDZC21 內部的組合?

[英]How to covert a Dataframe to a Dataset,having a object reference of the parent class as a composition inside another class?

我正在嘗試將Dataframe轉換為Dataset ,並且 java 類結構如下:

class

public class A {

    private int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

class B:

public class B extends A {

    private int b;

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }
}

和 class C

public class C {

    private A a;

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }
}

dataframe中的數據如下:

+-----+
|  a  |
+-----+
|[1,2]|
+-----+

當我嘗試將 Encoders.bean[C](classOf[C]) 應用於 dataframe 時。 object 參考A是 class CB的一個實例,當我檢查.isInstanceOf[B] 時,它沒有返回 true,我將其視為 false。 Dataset的output如下:

+-----+
|  a  |
+-----+
|[1,2]|
+-----+

我們如何在 foreach 中迭代時獲取 C object 下的 A 和 B 的所有字段?

代碼:-

object TestApp extends App {

  implicit val sparkSession = SparkSession.builder()
    .appName("Test-App")
    .config("spark.sql.codegen.wholeStage", value = false)
    .master("local[1]")
    .getOrCreate()


  var schema = new StructType().
    add("a", new ArrayType(new StructType().add("a", IntegerType, true).add("b", IntegerType, true), true))


  var dd = sparkSession.read.schema(schema).json("Test.txt")

  var ff = dd.as(Encoders.bean[C](classOf[C]))
  ff.show(truncate = false)



  ff.foreach(f => {
    println(f.getA.get(0).isInstanceOf[A])//---true
    println(f.getA.get(0).isInstanceOf[B])//---false
  })

文件內容: {"a":[{"a":1,"b":2}]}

Spark-catalyst使用谷歌反射從 java bean 中獲取模式。 請看一下JavaTypeInference.scala#inferDataType 這個 class 使用 getter 來收集字段名稱和 getter 的 returnType 來計算SparkType

由於 class C具有名為getA()且 returnType 為AA的吸氣劑,反過來,吸氣劑為getA()且 returnType 為int ,架構將創建為struct<a:struct<a:int>>其中struct<a:int>派生自getA A的 getA 。

這個問題我能想到的解決辦法是——

// Modify your class C to have Real class reference rather its super type
public class C {

    private B a;

    public B getA() {
        return a;
    }

    public void setA(B a) {
        this.a = a;
    }
}

輸出-

root
 |-- a: struct (nullable = true)
 |    |-- a: integer (nullable = false)
 |    |-- b: integer (nullable = false)

+------+
|a     |
+------+
|[1, 2]|
+------+

暫無
暫無

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

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