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