Есть ли объяснение, когда spark-csv не сохраняет DataFrame в файл? - PullRequest
3 голосов
/ 16 октября 2019

dataFrame.coalesce(1).write().save("path") иногда записывает только файлы _SUCCESS и ._SUCCESS.crc без ожидаемого * .csv.gz даже на непустые данные DataFrame

код сохранения файла:

private static void writeCsvToDirectory(Dataset<Row> dataFrame, Path directory) {
    dataFrame.coalesce(1)
            .write()
            .format("csv")
            .option("header", "true")
            .option("delimiter", "\t")
            .option("codec", "org.apache.hadoop.io.compress.GzipCodec")
            .mode(SaveMode.Overwrite)
            .save("file:///" + directory);
}

file get code:

static Path getTemporaryCsvFile(Path directory) throws IOException {
    String glob = "*.csv.gz";
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory, glob)) {
        return stream.iterator().next();
    } catch (NoSuchElementException e) {
        throw new RuntimeException(getNoSuchElementExceptionMessage(directory, glob), e);
    }
}

file get error error:

java.lang.RuntimeException: directory /tmp/temp5889805853850415940 does not contain a file with glob *.csv.gz. Directory listing:
    /tmp/temp5889805853850415940/_SUCCESS, 
    /tmp/temp5889805853850415940/._SUCCESS.crc

Я полагаюсь на это ожидание, может кто-нибудь объяснить мне, почему это работает таким образом?

1 Ответ

2 голосов
/ 21 октября 2019

Выходной файл должен (должен по логике) содержать хотя бы строку заголовка и несколько строк данных. Но он вообще не существует

Этот комментарий немного вводил в заблуждение. Согласно коду на Github, это произойдет, только если Dataframe пуст и не выдаст SUCCESS файлов. Учитывая, что эти файлы присутствуют - Dataframe не пустой, и writeCsvToDirectory из вашего кода срабатывает.

У меня есть пара вопросов:

  • Ваша работа Spark завершается безошибки?
  • Обновляется ли временная метка файла SUCCESS?

Двумя моими основными подозреваемыми являются:

  1. coalesce(1) - если у вас много данных, может произойти сбой
  2. SaveMode.Overwrite - Iесть ощущение, что эти файлы УСПЕХА находятся в этой папке из предыдущих запусков
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...