Java Spark使用wholeTextFiles如何将RDD key从全路径重映射为文件名
实现方案
核心问题是你之前单独提取key生成RDD的操作丢失了和原始文件内容value的绑定,正确做法是通过mapToPair操作同时处理key和value,替换路径为文件名的同时保留和文件内容的关联。
修正后完整代码
public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("Project"); JavaSparkContext sc = new JavaSparkContext(conf); // 读取目录下所有文件,得到<完整路径, 文件内容>的PairRDD JavaPairRDD<String, String> inputfiles = sc.wholeTextFiles("input1"); // 替换key为仅文件名,保留原文件内容关联 JavaPairRDD<String, String> namedFiles = inputfiles.mapToPair(fileTuple -> { String fullPath = fileTuple._1; // 拆分路径取最后一段,适配任意层级的路径结构 String fileName = fullPath.split("/")[fullPath.split("/").length - 1]; return new Tuple2<>(fileName, fileTuple._2); }); // 后续所有操作基于修改后的namedFiles执行,key均为文件名 JavaPairRDD<String,String> line = namedFiles.mapValues(s -> Arrays.asList(s.toLowerCase().split("\\W+")).iterator() ).flatMapValues(s -> s); line.saveAsTextFile("output"); sc.stop(); sc.close(); }
注意点
- 不要硬编码路径拆分后的索引(比如你之前写的
get(7)),取拆分后数组的最后一个元素可以适配任意层级的输入路径,避免路径结构变化导致异常 mapToPair是PairRDD专属操作,可以对每一条<key,value>二元组做处理后返回新的二元组,完全保留key和value的绑定关系,不会出现修改key后无法关联原始数据的问题
内容的提问来源于stack exchange,提问作者tarkan
相关产品推荐
相关产品推荐

