如何将数据集<Tuple2 <String,DeviceData >>转换为Iterator <DeviceData>

use*_*505 5 java apache-spark apache-spark-dataset apache-spark-2.0

我有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();
Run Code Online (Sandbox Code Playgroud)

我不能使用,collectAsList()因为我的数据很大,会妨碍性能.我查看了数据集API但无法获得任何解决方案.我用谷歌搜索,但找不到任何答案.有人可以指导我吗?如果解决方案在java中会很棒.谢谢.

编辑:

DeviceDataclass是简单的javabean.这是ds的printSchema()输出.

root
 |-- value: string (nullable = true)
 |-- _2: struct (nullable = true)
 |    |-- deviceData: string (nullable = true)
 |    |-- deviceId: string (nullable = true)
 |    |-- sNo: integer (nullable = true)
Run Code Online (Sandbox Code Playgroud)

mrs*_*vas 2

您可以直接DeviceData从中提取ds,而不用再次收集和构建。

爪哇:

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
Run Code Online (Sandbox Code Playgroud)

斯卡拉:

val ddDS = ds.map(_._2) //ds.map(row => row._2)
Run Code Online (Sandbox Code Playgroud)