Напишите два кадра данных в один csv [duplicate]

Я согласен с комментарием SilentGhost, цикл for не так уж плох. Вы можете добиться того, чего хотите:

l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]
for x in l: print "%0.2f" % (x)
2
задан kaks 19 December 2016 в 10:01
поделиться

3 ответа

Я не о Python, но в Scala и Java можно установить режим сохранения следующим образом:

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

Я предполагаю, что он должен быть похож на Python. Это может оказаться полезным.

0
ответ дан Community 15 August 2018 в 22:46
поделиться
  • 1
    Я попробовал то, что вы сказали в python. Но каждая строка моего вывода копируется в отдельные файлы csv в одной папке с именем sqlcsvA.csv. Они не копируются в один файл csv. – kaks 19 December 2016 в 10:00
  • 2
    @kaks, похоже, вам придется объединить эти файлы вручную. Взгляните на этот вопрос . Например, люди используют FileUtil.copyMerge в Java. – Anton Okolnychyi 19 December 2016 в 10:19
  • 3
    @kaks, обратите внимание, что если вы прочтете результаты назад (в Spark), эти файлы будут объединены, и у вас есть DataFrame, который содержит данные из всех файлов в этом каталоге. – Anton Okolnychyi 19 December 2016 в 10:24
  • 4
    Не нужно объединять их вручную, просто используйте .repartition(1) при записи. Когда вы читаете файлы обратно в фреймворк данных, это не позволяет их технически объединить, поскольку фрейм данных распределяется в кластере. Каждый файл будет основой раздела dataframe. Таким образом, в некотором смысле у вас есть один фрейм данных, но он все еще находится во многих основных частях. – Davos 4 September 2017 в 00:15

Из документов: 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")

Это более понятно и помогает понять.

2
ответ дан Davos 15 August 2018 в 22:46
поделиться
df.write.save(path='csv', format='csv', mode='append', sep='\t')
5
ответ дан Zhang Tong 15 August 2018 в 22:46
поделиться
  • 1
    Это снова разбивает выходные данные на разные файлы. Он разделяется. – kaks 19 December 2016 в 10:52
  • 2
    Включите .coalesce(1) перед записью, это предотвратит разделение, не уверен, что результат будет добавлен! df.coalesce(1).write.save(path='csv', format='csv', mode='append', sep='\t') – Jarek 19 December 2016 в 13:07
  • 3
    Благодарю. Это достало все в один файл. – kaks 20 December 2016 в 08:20
Другие вопросы по тегам:

Похожие вопросы: