如何将Map结果保存到Spark scala中的文本文件?

时间:2016-04-05 21:28:45

标签: scala apache-spark

我有这个:

val tokenFreq = reverseKey.countByKey
// tokenFreq: scala.collection.Map[String,Long] = Map(ABIGAIL -> 3,...

我想将tokenFreq的结果保存到文本文件中。

我尝试使用saveAsTextFile,但它说:

  

错误:值saveAsTextFile不是scala.collection.Map的成员[String,Long]

3 个答案:

答案 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。