[英]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 C
中B
的一個實例,當我檢查.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 為A
和A
的吸氣劑,反過來,吸氣劑為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.