web-dev-qa-db-fra.com

Enregistrement sous forme de texte dans Spark 1.30 à l'aide de Dataframes dans Scala

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")
6
jeffrey podolsky

Vous pouvez utiliser ceci:

teenagers.rdd.saveAsTextFile("/user/me/out")
12
ngtrkhoa

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 

8
lev

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]. 

1
Sietse

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

Cf https://github.com/databricks/spark-csv

1
Robert Chevallier