2016-10-16 52 views

回答

5

這是可能的。

在RDD中,您有saveAsObjectFilesaveAsTextFile函數。元組存儲爲(value1, value2),所以稍後可以解析它。

讀書可以從SparkContext 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]) 
+0

四重奏的例子中,這是一個純溶液:)。但是我們如何使用textFile來讀取,因爲saveAsText會創建許多不同的文件。 – pythonic

+0

@pythonic查看我的更新 - 您可以閱讀文件的範圍。 RDD的每個部分都保存在文件'part-XYZŹŻ'中,所以我們只能讀取每個文件的名稱 –

3

我會建議如果您的RDD是表格格式,請使用DataFrame。一個數據框是一個表或者二維數組結構,其中每列包含一個變量的度量值,每一行包含一個案例。 DataFrame由於其表格格式而具有額外的元數據,這允許Spark在最終查詢上運行某些優化。 其中一個RDD是一個彈性分佈式數據集,它更像是一個黑盒或抽象的數據無法優化的核心。 但是,您可以從DataFrame轉到RDD,反之亦然,您可以通過toDF方法從RDD轉到DataFrame(如果RDD採用表格格式)。

下面是創建/存儲在HDFS CSV和鑲木格式的數據幀,

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") 
相關問題