2015-03-27 14 views
6

Tôi đang sử dụng phiên bản Spark 1.3.0 và sử dụng các khung dữ liệu với SparkSQL trong Scala. Trong phiên bản 1.2.0 có một phương thức gọi là "saveAsText". Trong phiên bản 1.3.0 sử dụng các khung dữ liệu, chỉ có phương thức "lưu". Sản lượng mặc định là sàn gỗ.
Làm cách nào để xác định đầu ra phải TEXT bằng phương pháp lưu?Lưu dưới dạng Văn bản trong Spark 1.30 bằng Dataframes trong 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") 

Trả lời

1

Nếu bạn nhìn vào hướng dẫn chuyển đổi https://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-10-12-to-13, bạn có thể thấy rằng

[...] DataFrames không còn kế thừa từ RDD trực tiếp [...]

Bạn vẫn có thể sử dụng saveAsTextFile nếu bạn sử dụng phương thức ".rdd" để nhận RDD [Row].

+0

TVM, nhưng có bất kỳ tùy chọn để lưu dưới dạng văn bản bằng cách sử dụng phương pháp tiết kiệm. Tôi đã không thể tìm thấy nhiều tài liệu. Mặc định là để tiết kiệm như sàn gỗ. –

12

Bạn có thể sử dụng này:

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

Điều này sẽ viết một 'Hàng' trên mỗi dòng trong tệp đầu ra. Bạn có thể cần sử dụng 'map' để chuyển đổi các đối tượng' Row' thành csv trước khi lưu dưới dạng tệp văn bản. – arun

8

Trước hết, bạn nên cân nhắc nếu bạn thực sự cần phải lưu khung dữ liệu dưới dạng văn bản. Bởi vì DataFrame giữ dữ liệu theo cột (và không theo hàng dưới dạng rdd), hoạt động .rdd là tốn kém, vì dữ liệu cần phải được xử lý lại cho điều đó. sàn gỗ là định dạng cột và hiệu quả hơn nhiều để sử dụng.

Điều đó đang được nói, đôi khi bạn thực sự cần phải lưu dưới dạng tệp văn bản.

Theo như tôi biết DataFrame ngoài hộp sẽ không cho phép bạn lưu dưới dạng tệp văn bản. Nếu bạn nhìn vào source code, bạn sẽ thấy rằng 4 định dạng được hỗ trợ:

jdbc 
json 
parquet 
orc 

nên lựa chọn của bạn đang sử dụng df.rdd.saveAsTextFile như đề xuất trước đó, hoặc sử dụng spark-csv, mà sẽ cho phép bạn làm điều gì đó như :

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

với giá trị gia tăng năng xử lý những phần khó chịu của trích dẫn và thoát của chuỗi

+0

Lưu ý rằng phương pháp Spark 1.3 không được chấp nhận và sẽ bị xóa trong Spark 2.0 –

0

Trong python: để có được một CSV (không có tiêu đề) cho dataframe df

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

Ngoài ra còn có một phần mở rộng phát triển bởi Databricks: spark-csv

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

Các vấn đề liên quan