我在数据集中有以下架构 -
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
有任何线索吗?这是火花问题吗?我怎么能绕过它?
答案 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;
}
}