我正在使用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
是双倍的?
答案 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"))