2015-10-18 69 views
1

一个文本文件,当我使用saveAsTextFile一样,保存两个或多个不同RDDS在斯卡拉

rdd1.saveAsTextFile("../savefile") 
rdd2.saveAsTextFile("../savefile") 

我不能把两个不同的RDDS成一个单一的文本文件。我可以这样做吗?

此外,有没有一种方法可以将某些格式应用于我正在对文本文件进行压缩的文本?例如,添加一个\n或其他格式。

+1

你在寻找的东西不仅仅是一个工会更'(第一++秒).saveAsTextFile(” ../ SAVEFILE “)'” – lpiepiora

+0

因此,如果我使用'(rdd1 ++ rdd2).saveAsTextFile',我可以将这两个RDD保存在同一个文件中?我可以将某种格式应用于文件中的这些RDD吗? – yjgong

回答

1
  1. 一个单个文本文件是Spark比较模糊。每个分区都单独保存,这意味着每个分区只有一个文件。如果你想要一个单一的RDD,你必须将你的数据移动到一个单独的分区或收集,并且大部分时间要么昂贵,要么根本不可行。

  2. 你可以使用union方法RDDS的工会(或++lpiepiora在评论中提到的),但它只能如果两个RDDS是同一类型的:

    val rdd1 = sc.parallelize(1 to 5) 
    val rdd2 = sc.parallelize(Seq("a", "b", "c", "d", "e")) 
    rdd1.union(rdd2) 
    
    // <console>:26: error: type mismatch; 
    // found : org.apache.spark.rdd.RDD[String] 
    // required: org.apache.spark.rdd.RDD[Int] 
    //    rdd1.union(rdd2) 
    

    如果类型是不同的一个完整的想法虽然闻起来很腥。

  3. If you want a specific format您必须在致电saveAsTextFile之前应用它。 saveAsTextFile只需calls toString在每个元素上。

把上述所有的一起:

import org.apache.spark.rdd.RDD 

val rddStr1: RDD[String] = rdd1.map(x => ???) // Map to RDD[String] 
val rddStr2: RDD[String] = rdd2.map(x => ???) 

rdd1.union(rdd2) 
    .repartition(1) // Not recommended! 
    .saveAsTextFile(some_path)