DataFrame.to_csv выдает ошибку «[Errno 2] Нет такого файла или каталога» - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь записать DataFrame в файл .csv:

now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d")

enrichedDataDir = "/export/market_data/temp"
enrichedDataFile = enrichedDataDir + "/marketData_optam_" + date + ".csv"

dbutils.fs.ls(enrichedDataDir)
df.to_csv(enrichedDataFile, sep='; ')

Это приводит к следующей ошибке

IOError: [Errno 2] Нет такого файла иликаталог: '/export/market_data/temp/marketData_optam_2018-10-12.csv'

Но когда я делаю

dbutils.fs.ls(enrichedDataDir)

Out[72]: []

Там нет ошибки!Когда я захожу на уровни каталогов (на один уровень выше):

enrichedDataDir = "/export/market_data"
dbutils.fs.ls(enrichedDataDir)

Out[74]: 
[FileInfo(path=u'dbfs:/export/market_data/temp/', name=u'temp/', size=0L)
 FileInfo(path=u'dbfs:/export/market_data/update/', name=u'update/', size=0L)]

Это тоже работает.Для меня это означает, что у меня действительно есть все папки, к которым я хочу получить доступ.Но я не знаю, что опция .to_csv выдает ошибку.Я также проверил разрешения, которые в порядке!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Основная проблема заключалась в том, что я использую Micrsoft Azure Datalake Store для хранения этих .csv файлов.И по любой причине невозможно через df.to_csv выполнить запись в хранилище данных Azure.

Из-за того, что я пытался использовать df.to_csv, я использовал DataFrame Pandas вместо Spark DataFrame.

Я изменил на

from pyspark.sql import *

df = spark.createDataFrame(result,['CustomerId', 'SalesAmount'])

и затем записал в csv следующие строки

from pyspark.sql import *

df.coalesce(2).write.format("csv").option("header", True).mode("overwrite").save(enrichedDataFile) 

И это работает.

0 голосов
/ 12 октября 2018

вы пробовали открыть файл первым?(замените последнюю строку вашего первого примера на приведенный ниже код)

from os import makedirs
makedirs(enrichedDataDir)

with open(enrichedDataFile, 'w') as output_file:
    df.to_csv(output_file, sep='; ')
...