使用Scala中的Dataframes在Spark 1.30中保存为文本

时间:2015-03-27 14:19:36

标签: sql scala apache-spark

我正在使用Spark版本1.3.0并在Scala中使用带有SparkSQL的数据帧。在1.2.0版本中,有一个名为“saveAsText”的方法。在使用数据帧的1.3.0版中,只有一个“保存”方法。默认输出是镶木地板 如何使用save方法指定输出应为TEXT?

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

4 个答案:

答案 0 :(得分:12)

您可以使用:

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

答案 1 :(得分:8)

首先,您应该考虑是否确实需要将数据框保存为文本。 由于DataFrame按列保存数据(而不是按行保存为rdd),因此.rdd操作成本很高,因为需要对数据进行重新处理。 实木复合地板是一种柱状格式,使用效率更高。

话虽如此,有时你确实需要保存为文本文件。

据我所知DataFrame开箱即用,不允许您保存为文本文件。 如果查看source code,您会看到支持4种格式:

jdbc
json
parquet
orc

所以您的选项要么使用之前建议的df.rdd.saveAsTextFile, 或者使用spark-csv,这将允许您执行以下操作:

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

具有处理引用和转义字符串的恼人部分的附加值

答案 2 :(得分:1)

如果您查看迁移指南https://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-10-12-to-13,就可以看到

  

[...] DataFrames不再直接从RDD继承[...]

如果使用“.rdd”方法获取RDD [Row],仍然可以使用saveAsTextFile。

答案 3 :(得分:1)

在python中:为dataframe df

获取CSV(无标题)
df.rdd.map(lambda r: ";".join([str(c) for c in r])).saveAsTextFile(outfilepath)

还有Databricks开发的扩展:spark-csv

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