web-dev-qa-db-fra.com

Comment puis-je enregistrer un RDD dans HDFS et le relire plus tard?

J'ai un RDD dont les éléments sont de type (Long, String). Pour une raison quelconque, je souhaite enregistrer l'intégralité du RDD dans le HDFS, puis lire également ce RDD dans un programme Spark. Est-il possible de le faire? Et si oui, comment?

12
pythonic

C'est possible.

Dans RDD, vous disposez des fonctions saveAsObjectFile et saveAsTextFile. Les tuples sont stockés sous la forme (value1, value2), vous pourrez donc l'analyser plus tard.

La lecture peut être effectuée avec la fonction textFile de SparkContext puis .map éliminer ()

Donc: Version 1:

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

Version 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

Je recommanderais d'utiliser DataFrame si votre RDD est au format tabulaire. une trame de données est une table, ou une structure bidimensionnelle de type tableau, dans laquelle chaque colonne contient des mesures sur une variable et chaque ligne contient un cas. un DataFrame a des métadonnées supplémentaires en raison de son format tabulaire, qui permet à Spark d'exécuter certaines optimisations sur la requête finalisée. où un RDD est un ensemble de données distribué résilient qui est plus une boîte noire ou une abstraction principale de données qui ne peuvent pas être optimisées. Cependant, vous pouvez passer d'un DataFrame à un RDD et vice versa, et vous pouvez passer d'un RDD à un DataFrame (si le RDD est au format tabulaire) via la méthode toDF.

Voici l'exemple pour créer/stocker un DataFrame au format CSV et Parquet en HDFS,

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