[英]How can I save an RDD into HDFS and later read it back?
我有一個RDD,其元素是類型(長,字符串)。 出於某種原因,我想將整個RDD保存到HDFS中,稍后還會在Spark程序中讀取該RDD。 有可能嗎? 如果是這樣,怎么樣?
有可能的。
在RDD中,您有saveAsObjectFile
和saveAsTextFile
函數。 元組存儲為(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.