java - 如何为spark中的每个任务生成数字序列
问题描述
我正在使用下面的代码在火花中映射一些数据。我需要为每个任务生成一个唯一的序列号,同时将其映射到对 rdd。我尝试使用蓄电池。但是我从异常中了解到,在任务内部不可能从累加器中检索值。请帮助我,因为我对火花很陌生,对解决方案一无所知。
Accumulator<Integer> uniqueIdAccumulator = context.getJavaSparkContext().accumulator(0, "uniqueId");
JavaPairRDD<String, String> rdd1 = javaPairRdd.mapToPair(f-> {
uniqueIdAccumulator.add(1);
return new Tuple2<String,String>(f._1, this.getMessageString(f._2, null,uniqueIdAccumulator.value()));
});
解决方案
JavaPairRDD rdd1 = javaPairRdd.zipWithIndex().mapToPair(f-> {
return new Tuple2(f._1._1,this.getMessageString(f._1._2, null, f._2));
});
这里不需要蓄能器。ZipWithIndex 帮助获得了解决方案。ZipWIthIndex 返回具有现有元组和 Long 索引号的 RDD。我使用索引号来生成唯一的序列号。
推荐阅读
- c# - 如何使用 Aspose 将图像水印添加到 pdf 中?
- vue.js - 安装 vue-google-autocomplete 后的 Google 参考错误
- javascript - 递归 XHR 承诺在没有调用堆栈的情况下抛出 404 错误
- apache-camel - 使用 Apache-Camel Spring 启动器时无法扩展 SpringBootServletInitializer
- pycharm - 在pycharm中跳转到当前文件/选项卡中的定义的快捷方式
- lisp - common-lisp 中更好的 pythonic `join`
- mysql - 如何使用 Express 将 Node.js 与 MySQL 8.0 连接起来?
- node.js - 如何将数组中的数据一一发送到socket.io
- ruby-on-rails - Rails 5.2 不加载环境变量
- c# - 在 Regex C# 中允许撇号、点、& 符号、数字和字符