java - 如何将 Dataset<Tuple2<String,DeviceData>> 转换为 Iterator<DeviceData>

标签 java apache-spark apache-spark-2.0 apache-spark-dataset

我有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类是简单的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

斯卡拉:

val ddDS = ds.map(_._2) //ds.map(row => row._2)

关于java - 如何将 Dataset<Tuple2<String,DeviceData>> 转换为 Iterator<DeviceData>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42456409/

相关文章:

java - Spring从applicationContext获取bean的正确方法

java - 从servlet连接到mysql数据库

java - eclipse 自定义增量构建流程

apache-spark - 如何本地读取 Feather/箭头文件?

linux - Spark-2.4.0 docker 构建失败

Java删除ZipEntry

scala - 在 Spark SQL 中的一个查询中使用多个 collect_list

java - 如何修复 SparkUI Executors 、 java.io.FileNotFoundException

apache-spark - 如何将具有重复列名的数据框写入 pyspark 中的 csv 文件

apache-spark - 通过保留顺序,根据 id 列将 Spark DataFrame 拆分为两个 DataFrame(70% 和 30%)