Spark Java编码器-collectAsList上的开关字段
我在数据集中有以下模式-Spark Java编码器-collectAsList上的开关字段,java,apache-spark,apache-spark-sql,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
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)-
输出-
|data[2017-07-01].startTime|data[2017-07-01].endTime|
+------------------------------------+--------------+
|1498854000 |1498870800 |
这是收集以下各项的REUSELT后的结果-
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());
--
有线索吗?这是一个火花问题吗?如何绕过它?您可以添加带有列索引的setter和getter来解决此错误
我也看到过类似的问题。有什么解决方法或已知的bug吗?我想问题出在从“spark”到“java”的某个地方。我找到的解决方法是df.toJSON(),然后使用jackson对象映射器转换到所需的类。这是一个主要问题,特别是当数据成员来自不同类型时,请参见我的错误-
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
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;
}
}