Scala中RDD内容控制台输出及文本文件保存问题
修正后的Scala代码及解决方案
先聊聊你代码里的两个小问题:
line.split(".")里的.是正则表达式的通配符(匹配任意字符),根本不是你想的按点分割,得改成\\.才能匹配实际的点符号;splitRDD.foreach(println)打印的是String数组的对象引用(比如[Ljava.lang.String;@xxxx),不是数组里的实际内容,得处理数组才能输出值。
满足需求的完整代码
// 替换成你的实际输入文件路径 val file = "your_input_file_path" val emailMsg = sc.textFile(file) // 按点分割,同时过滤掉空字符串(处理可能的空行或首尾点) val splitRDD = emailMsg.map(line => line.split("\\.").filter(_.nonEmpty)) // 需求1:输出内容到控制台(两种可选方式) // 方式A:每个分割后的元素单独占一行打印 splitRDD.foreach(arr => arr.foreach(println)) // 方式B:把一行的分割结果拼成字符串,整行打印(比如用逗号分隔) // splitRDD.foreach(arr => println(arr.mkString(", "))) // 需求2:保存到文本文件 // 先把数组转成可读字符串,再合并为单文件(不需要单文件可去掉coalesce(1)) splitRDD.map(_.mkString(", ")).coalesce(1).saveAsTextFile("newfile")
关键细节说明
- 分割逻辑修正:正则里的
.必须转义,所以用\\.,如果你的分割符不是点,替换成对应正则即可; - 控制台输出选择:如果想逐个元素打印选方式A,想把一行的分割结果放一起看选方式B;
- 文件保存注意:必须把数组转成字符串(比如
mkString),不然保存的文件里全是数组对象的垃圾字符串,coalesce(1)是为了生成单个输出文件,不需要的话直接删掉,Spark会按分区生成多个文件。
内容的提问来源于stack exchange,提问作者Steve McAffer
相关产品推荐
相关产品推荐

