Spark Java编码器 - 在collectAsList上切换字段

时间:2017-07-13 13:57:48

标签: java apache-spark apache-spark-sql

我在数据集中有以下架构 -

root
 |-- userId: string (nullable = true)
 |-- data: map (nullable = true)
 |    |-- key: string
 |    |-- value: struct (valueContainsNull = true)
 |    |    |-- startTime: long (nullable = true)
 |    |    |-- endTime: long (nullable = true)
 |-- offset: long (nullable = true)

我有以下类(为简单起见,我省略了+ setter和getter) -

public class MyClass {

    private String userId;

    private Map<String, MyDTO> data;

    private Long offset;
 }

public class MyDTO {

    private long startTime;
    private long endTime;

}

我按以下方式收集结果 -

    Encoder<MyClass> myClassEncoder = Encoders.bean(MyClass.class);
    Dataset<MyClass> results = raw_df.as(myClassEncoder);
    List<MyClass> lst = results.collectAsList();

我做了几次计算以得到我想要的结果,结果在收集之前一直都是正确的。 这是 -

的结果
results.select(results.col("data").getField("2017-07-01").getField("startTime")).show(false);

输出 -

|data[2017-07-01].startTime|data[2017-07-01].endTime|
+------------------------------------+--------------+
|1498854000                |1498870800              |

这是收集 -

的重新获得后的结果
MyClass userData = results.collectAsList().get(0); MyDTO userDTO = userData.getData().get("2017-07-01"); System.out.println("userDTO startTime: " + userDTO.getStartTime()); System.out.println("userDTO endTime: " + userDTO.getEndTime());

-

data startTime: 1498870800
data endTime: 1498854000

有任何线索吗?这是火花问题吗?我怎么能绕过它?

1 个答案:

答案 0 :(得分:1)

您可以使用列索引添加setter和getter,以解决此错误SPARK-21402

public static class MyDTO {
    private long startTime;
    private long endTime;

    public long get1StartTime() {
        return startTime;
    }

    public void set1StartTime(long startTime) {
        this.startTime = startTime;
    }

    public long get2EndTime() {
        return startTime;
    }

    public void set2EndTime(long endTime) {
        this.endTime = endTime;
    }
}