簡體   English   中英

如何將RDD保存到HDFS中以后再讀回?

[英]How can I save an RDD into HDFS and later read it back?

我有一個RDD,其元素是類型(長,字符串)。 出於某種原因,我想將整個RDD保存到HDFS中,稍后還會在Spark程序中讀取該RDD。 有可能嗎? 如果是這樣,怎么樣?

有可能的。

在RDD中,您有saveAsObjectFilesaveAsTextFile函數。 元組存儲為(value1, value2) ,因此您可以稍后解析它。

可以使用textFile函數進行讀取,然后使用.map來消除()

所以:版本1:

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

版本2:

rdd.saveAsObjectFile ("hdfs:///test1/");
// later, in other program - watch, you have tuples out of the box :)
val newRdds = sparkContext.sc.sequenceFile("hdfs:///test1/part-*", classOf[Long], classOf[String])

如果您的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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM