我想把一个 Dataframe
到 Dataset
,java类结构如下:
a类:
public class A {
private int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
b类:
public class B extends A {
private int b;
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
和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时。对象引用 A
这是 B
在课堂上 C
当我检查时没有返回true。isinstanceof[b],我得到的结果是false。数据集的输出如下:
+-----+
| a |
+-----+
|[1,2]|
+-----+
在foreach中对c对象进行迭代时,如何获得c对象下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}]}
1条答案
按热度按时间uubf1zoe1#
Spark-catalyst
使用google反射从javabean中获取模式。请看一下javatypeinference.scala#inferdatatype。这个类使用getter收集字段名和getter的returntype来计算SparkType
.下课以来
C
盖特有名字吗getA()
返回类型为A
以及A
而getter则是getA()
返回类型为int
,架构将创建为struct<a:struct<a:int>>
哪里struct<a:int>
是从getA
班级A
.我能想到的解决这个问题的办法是-
输出-