如何使用Spark中的saveastextfile生成制表符分隔输出?

时间:2016-04-16 14:55:39

标签: scala apache-spark

我正在使用Scala,我希望saveAsTextFile直接将结果保存为制表符分隔,例如:

a 1
b 4
c 5

(空格是标签)

我只想使用saveAsTextFile(不打印),当我喜欢RDD[(String, Double)]时,我无法使用

ranks = ranks.map( f => f._1 +"\t"+f._2)

它说类型不匹配,我猜是因为f._1是字符串而f._2是双倍的?

1 个答案:

答案 0 :(得分:3)

代码中唯一的错误就是尝试将映射结果重新分配到同一个ranks变量中 - 我假设ranks的类型为RDD[(String, Double)],所以你确实可以不要为其指定RDD[String]类型的值。只需使用单独的变量:

val ranks: RDD[(String, Double)] = sc.parallelize(Seq(("a", 1D), ("b", 4D)))
val tabSeparated: RDD[String] = ranks.map(f => f._1 +"\t"+f._2)
tabSeparated.saveAsTextFile("./test.tsv")

一般来说,使用val而不是var来防止此类错误几乎总是更好。

注意:将元组(任意大小)转换为制表符分隔的字符串可能更简洁:

ranks.map(_.productIterator.mkString("\t"))