如何在pyspark中使用df.write.csv附加到csv文件?

时间:2016-12-19 07:29:37

标签: apache-spark pyspark

我正在尝试使用df.write.csv将数据附加到我的csv文件中。这是我在关注spark文档http://spark.apache.org/docs/2.0.1/api/python/pyspark.sql.html#pyspark.sql.DataFrameWriter之后所做的:

from pyspark.sql import DataFrameWriter
.....
df1 = sqlContext.createDataFrame(query1)
df1.write.csv("/opt/Output/sqlcsvA.csv", append) #also tried 'mode=append'

执行上面的代码会给我错误:

  

NameError:名称'append'未定义

没有追加,错误:

  

路径已经存在。

3 个答案:

答案 0 :(得分:7)

SQL> Prompt "Before trigger"
"Before trigger"

SQL> select  * from Doctors_At_Work;

no rows selected

SQL> select * from Consultations_Intervals;

no rows selected

SQL> create or replace trigger t_1
   before insert or update or delete on doctors_at_work
  2    3     for each row
  4  begin
   insert into consultations_intervals (doctor_id,
  5    6                                          the_date,
  7                                          start_hour_consult,
  8                                          stop
     .
     .
     .
 Trigger created.

SQL> Insert into DOCTORS_AT_WORK
   (DOCTOR_ID, THE_DATE, HOUR_START, HOUR_STOP, ROOM)
 Values
   (2, TO_DATE('12/18/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('12/13/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('12/14/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 12);
COMMIT;
  2    3    4  
1 row created.

SQL> 
Commit complete.

SQL> select  * from Doctors_At_Work;

 DOCTOR_ID THE_DATE  HOUR_STAR HOUR_STOP       ROOM
---------- --------- --------- --------- ----------
         2 18-DEC-16 13-DEC-16 14-DEC-16         12

SQL> select * from Consultations_Intervals;

 DOCTOR_ID THE_DATE  START_HOUR_CONSULT STOP_HOUR_CONSUT       ROOM
---------- --------- ------------------ ---------------- ----------
         2 19-DEC-16                 17               17         12

答案 1 :(得分:2)

来自文档: https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameWriter 自v1.4起

csv(path, mode=None, compression=None, sep=None, quote=None, escape=None, header=None, nullValue=None, escapeQuotes=None, quoteAll=None, dateFormat=None, timestampFormat=None)

e.g。

from pyspark.sql import DataFrameWriter
.....
df1 = sqlContext.createDataFrame(query1)
df1.write.csv(path="/opt/Output/sqlcsvA.csv", mode="append")

如果要编写单个文件,可以在其中任何一行上使用合并或repartition。并不重要哪一行,因为数据帧只是一个DAG执行,在写入csv之前不会执行任何操作。 repartition& coalesce有效地使用相同的代码,但合并只能减少repartition也可以增加它们的分区数量。为简单起见,我只是坚持repartition

e.g。

df1 = sqlContext.createDataFrame(query1).repartition(1)

df1.repartition(1).write.csv(path="/opt/Output/sqlcsvA.csv", mode="append")

我认为文档中的示例并不好,但它们并未显示使用路径以外的参数的示例。

参考你尝试过的两件事:

(append)

要使其工作,需要有一个名为append的字符串变量,其中包含值" append"。 DataFrameWriter库中没有字符串常量,称为append。 即你可以在代码中添加它,然后它就可以了。 append ="追加"

('mode=append')

为了实现这一点,csv方法必须解析出mode=append字符串以获取模式的值,当你只需要一个具有恰好值&#34的参数时,这将是额外的工作。 ;追加"或"覆盖"需要提取。没有一个特殊情况,Python内置,不是特定于pyspark。

另一方面,我建议尽可能使用命名参数。 e.g。

csv(path="/path/to/file.csv", mode="append")

而不是位置参数

csv("/path/to/file.csv", "append")

它更清晰,有助于理解。

答案 2 :(得分:0)

我不是关于Python,但是在Scala和Java中,可以通过以下方式设置保存模式:

df.write.mode("append").csv("pathToFile")

我认为它在Python中应该类似。 This可能会有所帮助。