Я согласен с комментарием SilentGhost, цикл for не так уж плох. Вы можете добиться того, чего хотите:
l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
for x in l: print "%0.2f" % (x)
Я не о Python, но в Scala и Java можно установить режим сохранения следующим образом:
df.write.mode("append").csv("pathToFile")
Я предполагаю, что он должен быть похож на Python. Это может оказаться полезным.
Из документов: 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)
, например
from pyspark.sql import DataFrameWriter
.....
df1 = sqlContext.createDataFrame(query1)
df1.write.csv(path="/opt/Output/sqlcsvA.csv", mode="append")
Если вы хотите записать один файл, вы можете использовать coalesce или repartition
на любой из этих строк. Не имеет значения, какая строка, потому что dataframe является просто выполнением DAG, выполнение не выполняется до записи в csv. repartition
& amp; coalesce
эффективно используют один и тот же код, но объединение может только уменьшить количество разделов, где repartition
также может увеличить их. Я просто придерживался repartition
для простоты.
, например
df1 = sqlContext.createDataFrame(query1).repartition(1)
или
df1.repartition(1).write.csv(path="/opt/Output/sqlcsvA.csv", mode="append")
Я думаю, что примеры в документах aren ' t велика, они не показывают примеры использования параметров, отличных от пути.
Ссылаясь на две вещи, которые вы пробовали:
(append)
Для что для работы должна существовать строковая переменная с именем append, содержащая значение «append». В библиотеке DataFrameWriter, называемой append, нет строковой константы. т. е. вы могли бы добавить это ранее в свой код, и тогда это сработает. append = "append"
('mode=append')
Для этого для метода csv необходимо проанализировать строку mode=append
, чтобы получить значение для режима, которое быть дополнительной работой, когда вы можете просто иметь параметр с точно значением «добавить» или «перезаписать», которое необходимо извлечь. Ни один не является особым случаем, встроенным Python, не специфичным для pyspark.
В другой заметке я рекомендую использовать именованные параметры там, где это возможно. например,
csv(path="/path/to/file.csv", mode="append")
вместо позиционных параметров
csv("/path/to/file.csv", "append")
Это более понятно и помогает понять.
df.write.save(path='csv', format='csv', mode='append', sep='\t')
.coalesce(1)
перед записью, это предотвратит разделение, не уверен, что результат будет добавлен! df.coalesce(1).write.save(path='csv', format='csv', mode='append', sep='\t')
– Jarek
19 December 2016 в 13:07
sqlcsvA.csv
. Они не копируются в один файл csv. – kaks 19 December 2016 в 10:00.repartition(1)
при записи. Когда вы читаете файлы обратно в фреймворк данных, это не позволяет их технически объединить, поскольку фрейм данных распределяется в кластере. Каждый файл будет основой раздела dataframe. Таким образом, в некотором смысле у вас есть один фрейм данных, но он все еще находится во многих основных частях. – Davos 4 September 2017 в 00:15