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?
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])
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")