web-dev-qa-db-ja.com

RDDをHDFSに保存し、後でそれを読み戻すにはどうすればよいですか?

要素がタイプ(Long、String)のRDDがあります。何らかの理由で、RDD全体をHDFSに保存し、後でそのRDDをSparkプログラムに戻します。そうすることは可能ですか。

12
pythonic

可能です。

RDDには、saveAsObjectFileおよびsaveAsTextFile関数があります。タプルは(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])
12
T. Gawęda

RDDが表形式の場合は、DataFrameを使用することをお勧めします。データフレームはテーブルまたは2次元配列のような構造で、各列には1つの変数の測定値が含まれ、各行には1つのケースが含まれます。 DataFrameには、その表形式のために追加のメタデータがあり、これによりSparkが最終的なクエリで特定の最適化を実行できるようになります。RDDは、ブラックボックスまたはただし、DataFrameからRDDに、またはその逆に移動できます。また、toDFメソッドを使用してRDDからDataFrameに移動できます(RDDが表形式の場合)。

以下は、CSVのDataFrameとHDFSのParquet形式を作成/保存する例です。

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")
4
Kris