我有这个:
val tokenFreq = reverseKey.countByKey
// tokenFreq: scala.collection.Map[String,Long] = Map(ABIGAIL -> 3,...
我想将tokenFreq的结果保存到文本文件中。
我尝试使用saveAsTextFile,但它说:
错误:值saveAsTextFile不是scala.collection.Map的成员[String,Long]
答案 0 :(得分:3)
您只需将Map
转换为RDD[(String, Long)]
,然后使用RDD
API保存即可。
val conf = new SparkConf().setAppName("TokenCounter").setMaster("local[4]")
val sc = new SparkContext(conf)
val tokenFreq = reverseKey.countByKey
sc.parallelize(tokenFreq.toSeq).saveAsTextFile("token_freq")
当然,这会转换您的数据结构,但是您可以将其读取RDD
然后将其作为地图收集以重新获得快速查找。
val tokenFreqMap = sc.textFile("token_freq").collectAsMap
答案 1 :(得分:1)
当countByKey
返回纯scala Map
时,您必须使用scala的常规方法将其存储到文件中。
Here is一种方法:
import java.io.PrintWriter
new PrintWriter("filename") {
tokenFreq.foreach {
case (k, v) =>
write(k + ":" + v)
write("\n")
}
close()
}
请注意,在从所有工作人员收集countByKey
的结果后,将在驱动程序上执行此代码。
答案 2 :(得分:0)
您可以使用saveAs * apis将集合分发到spark群集中。通过在RDD / DataFrame / DataSet上使用countByKey,数据将在集群中的数据之间收集到Spark驱动程序。因此,您无法在收集的集合中使用saveAs * api。