Scala-Spark技术问题:RDD[(String,String)]转Array[String]及diff类型不匹配解决
问题分析
你遇到的核心问题是:stopWord是RDD[(String, String)]类型(来自wholeTextFiles,每个元素对应(文件路径, 文件内容)),而vocabArray1是本地的Array[String],diff方法仅支持同类型集合操作,所以必须先把停用词RDD转换成和vocabArray1同类型的本地数组。
解决方案
1. 将停用词RDD转换为Array[String]
wholeTextFiles返回的RDD存储的是文件路径和文件内容的键值对,我们需要提取文件内容,分割成单个停用词,再拉取到本地转为数组:
// 处理停用词RDD,转换为本地Array[String] val stopWordsArray: Array[String] = stopWord // 提取文件内容,按空白字符(换行、空格等)分割成单个词 .flatMap { case (_, content) => content.split("\\s+") } // 过滤分割后产生的空字符串 .filter(_.nonEmpty) // 去重(避免停用词文件里的重复项) .distinct() // 将RDD数据拉取到Driver节点,转为Array[String] .collect()
如果你的停用词文件是每行一个停用词,可以用更精准的分割方式:
.flatMap { case (_, content) => content.split("\n").map(_.trim) }
加上trim能去掉每行前后的空白字符,避免出现带空格的无效停用词。
2. 执行diff操作
现在stopWordsArray和vocabArray1都是Array[String]类型,就可以正常使用diff了:
val vocabArray = vocabArray1 diff stopWordsArray
额外提示
collect()会把RDD的所有数据拉取到Driver节点,不过停用词列表通常体积很小,不会带来性能问题;如果是超大词表场景,建议改用RDD层面的过滤操作(比如filter+contains)来避免大量数据拉取。
内容的提问来源于stack exchange,提问作者Monaheng Ramokhoro
相关产品推荐
相关产品推荐

