2015-03-27 15 views
6

Sto utilizzando Spark versione 1.3.0 e utilizzo di dataframes con SparkSQL in Scala. Nella versione 1.2.0 c'era un metodo chiamato "saveAsText". Nella versione 1.3.0 usando i dataframes c'è solo un metodo "salva". L'uscita predefinita è parquet.
Come posso specificare che l'output debba essere TESTO usando il metodo di salvataggio?Salvataggio come testo in Spark 1.30 utilizzando Dataframes in Scala

// 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") 

risposta

1

Se si guarda la guida alla migrazione https://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-10-12-to-13, si può vedere che

[...] DataFrames ereditano non è più da RDD direttamente [...]

È ancora possibile utilizzare saveAsTextFile se si utilizza il metodo ".rdd" per ottenere un RDD [Row].

+0

TVM, ma c'è qualche possibilità di salvare come testo utilizzando il metodo save. Non sono stato in grado di trovare molta documentazione. L'impostazione predefinita è di salvare come parquet. –

12

È possibile utilizzare questo:

teenagers.rdd.saveAsTextFile("/user/me/out") 
+0

Scriverà una 'Riga' per riga nel file di output. Potrebbe essere necessario usare 'map' per convertire gli oggetti' Row' in csv prima di salvarli come file di testo. – arun

8

Prima di tutto, si dovrebbe prendere in considerazione se si ha realmente bisogno di salvare il frame di dati come testo. Poiché DataFrame contiene i dati per colonne (e non per righe come rdd), l'operazione .rdd è costosa, poiché i dati devono essere rielaborati per quello. parquet è un formato colonnare ed è molto più efficiente da utilizzare.

Ciò detto, a volte è davvero necessario salvare come file di testo.

Per quanto ne so, lo DataFrame non consente di salvarlo come file di testo. Se si guarda al source code, vedrai che 4 formati sono supportati:

jdbc 
json 
parquet 
orc 

in modo che le opzioni sono in uso df.rdd.saveAsTextFile come suggerito prima, o per utilizzare spark-csv, che vi permetterà di fare qualcosa di simile :

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

con il valore aggiunto di gestire le parti fastidiose di quotazione e fuga delle stringhe

+0

Si noti che il metodo Spark 1.3 è deprecato e verrà rimosso in Spark 2.0 –

0

in Python: per ottenere un file CSV (nessuna intestazione) per dataframe df

df.rdd.map(lambda r: ";".join([str(c) for c in r])).saveAsTextFile(outfilepath) 

C'è anche un'estensione sviluppato da Databricks: scintilla csv

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

Problemi correlati