如何将RDD保存到HDFS中以后再读回?

时间:2016-10-16 10:28:26

标签: scala apache-spark hdfs rdd bigdata

我有一个RDD,其元素类型为(Long,String)。出于某种原因,我想将整个RDD保存到HDFS中,稍后还会在Spark程序中读取该RDD。有可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:11)

有可能。

在RDD中,您有fun int2double(x: int): double = $UN.cast{double}(x) saveAsObjectFile个功能。元组存储为saveAsTextFile,因此您可以稍后对其进行解析。

可以使用SparkContext中的(value1, value2)函数进行阅读,然后使用textFile来消除.map

所以: 版本1:

()

第2版:

rdd.saveAsTextFile ("hdfs:///test1/");
// later, in other program
val newRdds = sparkContext.textFile("hdfs:///test1/part-*").map (x => {
    // here remove () and parse long / strings
})

答案 1 :(得分:4)

如果您的RDD是表格格式,我建议使用DataFrame。数据框是一个表或二维数组结构,其中每列包含一个变量的测量值,每行包含一个案例。 由于表格格式,DataFrame具有其他元数据,这允许Spark对最终查询运行某些优化。 其中RDD是弹性分布式数据集,它更像是无法优化的数据的黑盒或核心抽象。 但是,您可以从DataFrame转到RDD,反之亦然,您可以通过toDF方法从RDD转到DataFrame(如果RDD是表格格式)。

以下是在HDFS中以CSV和Parquet格式创建/存储DataFrame的示例,

val conf = {
   new SparkConf()
     .setAppName("Spark-HDFS-Read-Write")
 }

 val sqlContext = new SQLContext(sc)

 val sc = new SparkContext(conf)

 val hdfs = "hdfs:///"
 val df = Seq((1, "Name1")).toDF("id", "name")

 //  Writing file in CSV format
 df.write.format("com.databricks.spark.csv").mode("overwrite").save(hdfs + "user/hdfs/employee/details.csv")

 // Writing file in PARQUET format
 df.write.format("parquet").mode("overwrite").save(hdfs + "user/hdfs/employee/details")

 //  Reading CSV files from HDFS
 val dfIncsv = sqlContext.read.format("com.databricks.spark.csv").option("inferSchema", "true").load(hdfs + "user/hdfs/employee/details.csv")

 // Reading PQRQUET files from HDFS
 val dfInParquet = sqlContext.read.parquet(hdfs + "user/hdfs/employee/details")