如何将 Dataset<Tuple2<String,DeviceData>> 转换为 Iterator<DeviceData>
How to transform Dataset<Tuple2<String,DeviceData>> to Iterator<DeviceData>
我有 Dataset<Tuple2<String,DeviceData>>
,想将其转换为 Iterator<DeviceData>
。
下面是我使用 collectAsList()
方法然后获取 Iterator<DeviceData>
的代码。
Dataset<Tuple2<String,DeviceData>> ds = ...;
List<Tuple2<String, DeviceData>> listTuple = ds.collectAsList();
ArrayList<DeviceData> myDataList = new ArrayList<DeviceData>();
for(Tuple2<String, DeviceData> tuple : listTuple){
myDataList.add(tuple._2());
}
Iterator<DeviceData> myitr = myDataList.iterator();
我不能使用 collectAsList()
,因为我的数据很大,会影响性能。我查看了数据集 API 但无法找到任何解决方案。我用谷歌搜索但找不到任何答案。有人可以指导我吗?如果解决方案在 java 中,那就太好了。谢谢。
编辑:
DeviceData
class 是简单的 javabean。这是 ds.
的 printSchema() 输出
root
|-- value: string (nullable = true)
|-- _2: struct (nullable = true)
| |-- deviceData: string (nullable = true)
| |-- deviceId: string (nullable = true)
| |-- sNo: integer (nullable = true)
您可以直接从ds
中提取DeviceData
,而无需再次收集和构建。
Java:
Function<Tuple2<String, DeviceData>, DeviceData> mapDeviceData =
new Function<Tuple2<String, DeviceData>, DeviceData>() {
public DeviceData call(Tuple2<String, DeviceData> tuple) {
return tuple._2();
}
};
Dataset<DeviceData> ddDS = ds.map(mapDeviceData) //extracts DeviceData from each record
Scala:
val ddDS = ds.map(_._2) //ds.map(row => row._2)
我有 Dataset<Tuple2<String,DeviceData>>
,想将其转换为 Iterator<DeviceData>
。
下面是我使用 collectAsList()
方法然后获取 Iterator<DeviceData>
的代码。
Dataset<Tuple2<String,DeviceData>> ds = ...;
List<Tuple2<String, DeviceData>> listTuple = ds.collectAsList();
ArrayList<DeviceData> myDataList = new ArrayList<DeviceData>();
for(Tuple2<String, DeviceData> tuple : listTuple){
myDataList.add(tuple._2());
}
Iterator<DeviceData> myitr = myDataList.iterator();
我不能使用 collectAsList()
,因为我的数据很大,会影响性能。我查看了数据集 API 但无法找到任何解决方案。我用谷歌搜索但找不到任何答案。有人可以指导我吗?如果解决方案在 java 中,那就太好了。谢谢。
编辑:
DeviceData
class 是简单的 javabean。这是 ds.
root
|-- value: string (nullable = true)
|-- _2: struct (nullable = true)
| |-- deviceData: string (nullable = true)
| |-- deviceId: string (nullable = true)
| |-- sNo: integer (nullable = true)
您可以直接从ds
中提取DeviceData
,而无需再次收集和构建。
Java:
Function<Tuple2<String, DeviceData>, DeviceData> mapDeviceData =
new Function<Tuple2<String, DeviceData>, DeviceData>() {
public DeviceData call(Tuple2<String, DeviceData> tuple) {
return tuple._2();
}
};
Dataset<DeviceData> ddDS = ds.map(mapDeviceData) //extracts DeviceData from each record
Scala:
val ddDS = ds.map(_._2) //ds.map(row => row._2)