Spark Java读取文本文件分割后打印出现数组地址问题求助
解决Spark Java中打印单词显示数组地址而非实际内容的问题
嘿,我一眼就看出问题出在哪了——你现在打印的是数组对象本身,而不是数组里的单词元素!split()方法返回的是String[]类型的数组,Java默认打印这种对象时,只会输出它的内存地址(就是你看到的[[Ljava.lang.String;@xxx]格式),再加上你把这些数组塞进了ArrayList<String[]>里,打印的时候自然就全是一堆数组地址了。
正确的处理方式
要解决这个问题,你需要把每行拆分出的单词扁平化,让每个单词都成为RDD的独立元素,这里应该用flatMap代替map——map是一对一转换,会把整个数组当作一个元素保留;而flatMap可以把一个输入行拆分成多个输出元素(也就是每个单词)。
修改后的代码示例
// 读取文本文件,生成每行的RDD JavaRDD<String> documents = sc.textFile(path, 1000); // 使用flatMap拆分每行成单个单词 JavaRDD<String> words = documents.flatMap(document -> { // 按空格拆分单词(可根据需求调整拆分规则,比如处理标点) String[] splitWords = document.split("\\s+"); // 将数组转为Iterable,flatMap会自动遍历每个元素输出 return Arrays.asList(splitWords).iterator(); }); // 现在打印就能看到实际单词内容了 words.foreach(word -> System.out.println(word));
进阶优化(处理复杂场景)
如果你的文本里有标点、空字符串或者需要统一大小写,可以在拆分后做额外处理:
JavaRDD<String> cleanWords = documents.flatMap(document -> { // 按非字母数字字符拆分,避免标点粘在单词上 String[] splitWords = document.split("[^a-zA-Z0-9]+"); List<String> cleanWordList = new ArrayList<>(); for (String word : splitWords) { if (!word.isEmpty()) { // 过滤拆分产生的空字符串 cleanWordList.add(word.toLowerCase()); // 统一转为小写 } } return cleanWordList.iterator(); }); cleanWords.foreach(cleanWord -> System.out.println(cleanWord));
内容的提问来源于stack exchange,提问作者Dilak
相关产品推荐
相关产品推荐

