ApacheSpark—如何将Dataframe转换为数据集,将父类的对象引用作为另一个类中的组合?

n3h0vuf2  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(363)

我想把一个 DataframeDataset ,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}]}

uubf1zoe

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 .
我能想到的解决这个问题的办法是-

// 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]|
+------+

相关问题