J'utilise Spark version 1.3.0 et des bases de données avec SparkSQL dans Scala. Dans la version 1.2.0, il existait une méthode appelée "saveAsText". Dans la version 1.3.0 utilisant des cadres de données, il n’existe qu’une méthode "save". La sortie par défaut est parquet.
Comment puis-je spécifier que la sortie doit être TEXT en utilisant la méthode save?
// sc is an existing SparkContext.
val sqlContext = new org.Apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._
// Define the schema using a case class.
// Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,
// you can use custom classes that implement the Product interface.
case class Person(name: String, age: Int)
// Create an RDD of Person objects and register it as a table.
val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.registerTempTable("people")
// SQL statements can be run by using the sql methods provided by sqlContext.
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
teenagers.save("/user/me/out")
Vous pouvez utiliser ceci:
teenagers.rdd.saveAsTextFile("/user/me/out")
Tout d’abord, vous devez déterminer si vous devez vraiment enregistrer le bloc de données en tant que texte. Étant donné que DataFrame
conserve les données par colonnes (et non par lignes comme rdd), l'opération .rdd
est coûteuse, car les données doivent être retraité pour cela. Le parquet est un format en colonnes et est beaucoup plus efficace à utiliser.
Cela dit, vous avez parfois besoin de sauvegarder en tant que fichier texte.
Autant que je sache, DataFrame
prêt à l'emploi ne vous permettra pas de sauvegarder en tant que fichier texte. Si vous regardez le code source , vous verrez que 4 formats sont supportés:
jdbc
json
parquet
orc
vos options sont donc soit d'utiliser df.rdd.saveAsTextFile
comme suggéré précédemment, , soit d'utiliser spark-csv , ce qui vous permettra de faire quelque chose comme:
Spark 1.4+:
val df = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("cars.csv")
df.select("year", "model").write.format("com.databricks.spark.csv").save("newcars.csv")
Spark 1.3:
val df = sqlContext.load("com.databricks.spark.csv", Map("path" -> "cars.csv", "header" -> "true"))
df.select("year", "model").save("newcars.csv", "com.databricks.spark.csv")
avec la valeur ajoutée de gérer les parties ennuyeuses de la citation et de la sortie des cordes
Si vous consultez le guide de migration https://spark.Apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-10-12-to-13 , vous peut voir que
[...] Les DataFrames n'héritent plus directement du RDD [...]
Vous pouvez toujours utiliser saveAsTextFile si vous utilisez la méthode ".rdd" pour obtenir un RDD [Row].
En python: pour obtenir un CSV (sans en-tête) pour dataframe df
df.rdd.map(lambda r: ";".join([str(c) for c in r])).saveAsTextFile(outfilepath)
Il y a aussi une extension développée par Databricks: spark-csv