我正在尝试使用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'未定义
没有追加,错误:
路径已经存在。
答案 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可能会有所帮助。