2015-07-13 17 views
21

Tôi đang sử dụng spark-1.3.1 (pyspark) và tôi đã tạo một bảng bằng truy vấn SQL. Bây giờ tôi có một đối tượng là một DataFrame. Tôi muốn xuất khẩu đối tượng DataFrame này (tôi đã gọi nó là "bảng") vào một tệp csv để tôi có thể thao tác và vẽ các cột. Làm cách nào để xuất bảng DataFrame "" sang tệp csv?làm cách nào để xuất khung dữ liệu bảng trong pyspark sang csv?

Cảm ơn!

Trả lời

58

Nếu khung dữ liệu phù hợp trong một bộ nhớ điều khiển và bạn muốn lưu vào hệ thống tập tin địa phương, bạn có thể chuyển đổi Spark DataFrame đến địa phương Pandas DataFrame sử dụng toPandas phương pháp và sau đó chỉ cần sử dụng to_csv:

df.toPandas().to_csv('mycsv.csv') 

Nếu không, bạn có thể sử dụng spark-csv:

  • Spark 1,3

    df.save('mycsv.csv', 'com.databricks.spark.csv') 
    
  • Spark 1.4+

    df.write.format('com.databricks.spark.csv').save('mycsv.csv') 
    

Trong Spark 2.0+ bạn có thể sử dụng csv nguồn dữ liệu trực tiếp:

df.write.csv('mycsv.csv') 
+0

Câu trả lời siêu. Đối với tùy chọn đầu tiên, nếu tôi muốn ghi vào một tệp được phân cách bằng đường ống thay vì CSV được phân tách bằng dấu phẩy, điều này có khả thi không? –

+2

Nếu bạn có các khung dữ liệu tia lửa, bạn có thể sử dụng 'df.write.csv ('/ tmp/lookatme /')' và sẽ thả một tập hợp các tệp csv trong '/ tmp/lookatme' Sử dụng tia lửa nhanh hơn đáng kể so với tuần tự hóa nó trong gấu trúc. Hạn chế duy nhất là bạn sẽ kết thúc với một tập hợp các csvs thay vì một bộ duy nhất và nếu công cụ đích không biết làm thế nào để nối chúng, bạn sẽ cần phải làm điều đó cho mình. – Txangel

+0

Thật là một vấn đề lớn khi nhận được một csv từ tia lửa. Một cái gì đó thú vị về giải pháp đầu tiên đó là 'to_csv' hoạt động mà không cần phải nhập khẩu Pandas. '.toPandas' là một phần của Spark có thể nó nhập khẩu ngầm nó .. – cardamom

12

Nếu bạn không thể sử dụng tia lửa-csv, bạn có thể làm như sau:

df.rdd.map(lambda x: ",".join(map(str, x))).coalesce(1).saveAsTextFile("file.csv") 

Nếu bạn cần xử lý chuỗi dấu ngắt dòng hoặc dấu phẩy sẽ không hoạt động. Sử dụng điều này:

import csv 
import cStringIO 

def row2csv(row): 
    buffer = cStringIO.StringIO() 
    writer = csv.writer(buffer) 
    writer.writerow([str(s).encode("utf-8") for s in row]) 
    buffer.seek(0) 
    return buffer.read().strip() 

df.rdd.map(row2csv).coalesce(1).saveAsTextFile("file.csv") 
3

Làm thế nào về điều này (bạn không muốn một lớp lót)?

for row in df.collect(): 
    d = row.asDict() 
    s = "%d\t%s\t%s\n" % (d["int_column"], d["string_column"], d["string_column"]) 
    f.write(s) 

f là bộ mô tả tệp đã mở. Ngoài ra dấu phân cách là một TAB char, nhưng nó dễ dàng để thay đổi bất cứ điều gì bạn muốn.

8

Đối với Apache Spark 2+, để lưu khung dữ liệu vào tệp csv duy nhất. Sử dụng lệnh sau

query.repartition(1).write.csv("cc_out.csv", sep='|') 

Ở đây 1 chỉ ra rằng tôi chỉ cần một phân vùng csv. bạn có thể thay đổi nó theo yêu cầu của bạn.

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