Запись в файл в Apache Beam

Я запускаю программу WordCount в Windows, используя Apache Beam через DirectRunner. Я вижу, что выходные файлы создаются во временной папке (в src / main / resources /). Но запись в выходной файл не выполняется. Ниже приведен фрагмент кода:

p.apply("ReadMyFile", TextIO.read().from("src/main/resources/input.txt"))
                .apply(Regex.split(" "))
                .apply(Count.<String>perElement())
                .apply(ToString.elements())
                .apply(TextIO.write().to("src/main/resources/output.txt"));

Пожалуйста, дайте мне знать формат, который он ожидает для выходного каталога / файла. Заранее спасибо

Ниже приводится ошибка: Добавление исключения: вызвано: java.lang.IllegalStateException: невозможно найти регистратора для i в org.apache.beam.sdk.io.FileSystems.getFileSystemInternal (FileSystems.java:447) в org.apache.beam .sdk.io.FileSystems.match (FileSystems.java:111) в org.apache.beam.sdk.io.FileSystems.matchResources (FileSystems.java:174) в org.apache.beam.sdk.io.FileSystems.delete (FileSystems.java:321) на org.apache.beam.sdk.io.FileBasedSink $ Writer.cleanup (FileBasedSink.java:905) на org.apache.beam.sdk.io.WriteFiles $ WriteShardedBundles.processElement (WriteFiles.java : 376)


person Anuroopa George    schedule 15.09.2017    source источник
comment
Когда вы говорите, что программа не работает, всегда прилагайте полную распечатку ошибки. Просто знать, что ваша программа не работает, недостаточно, чтобы исправить это.   -  person jkff    schedule 17.09.2017
comment
Добавление исключения: вызвано: java.lang.IllegalStateException: невозможно найти регистратора для i в org.apache.beam.sdk.io.FileSystems.getFileSystemInternal (FileSystems.java:447) в org.apache.beam.sdk.io. FileSystems.match (FileSystems.java:111) в org.apache.beam.sdk.io.FileSystems.matchResources (FileSystems.java:174) в org.apache.beam.sdk.io.FileSystems.delete (FileSystems.java: 321) на org.apache.beam.sdk.io.FileBasedSink $ Writer.cleanup (FileBasedSink.java:905) на org.apache.beam.sdk.io.WriteFiles $ WriteShardedBundles.processElement (WriteFiles.java:376)   -  person Anuroopa George    schedule 19.09.2017
comment
Обновил вопрос распечаткой ошибки. Спасибо   -  person Anuroopa George    schedule 19.09.2017


Ответы (2)


В настоящее время Beam не очень хорошо обрабатывает пути Windows. См. Связанные JIRA, например этот. Возможно, попробуйте указать абсолютный путь с помощью file://?

person jkff    schedule 19.09.2017
comment
Использование file: // также не сработало. Я смог успешно работать в Unix-боксе. Как вы упомянули, это может быть проблема с Windows. - person Anuroopa George; 21.09.2017

Резюме: вы можете использовать символ "/" вместо диска, на котором выполняется процесс, например если ваш выходной файл находится в

"C: / myFile"

написать

TextIO.write().to("/myFile"));

Более длинный ответ:

Даже после того, как проблема, упомянутая в ответе jkff (этот), была решена, я могли только заставить работать так, как они указали, для ввода, а не для вывода.

Документация javadoc в LocalFileSystem говорит

 * <p>Windows OS:
 *
 * <ul>
 *   <li>pom.xml
 *   <li>C:/Users/beam/Documents/pom.xml
 *   <li>C:\\Users\\beam\\Documents\\pom.xml
 *   <li>file:/C:/Users/beam/Documents/pom.xml
 *   <li>file:///C:/Users/beam/Documents/pom.xml
 * </ul>
 */

но ни один из них не работал для метода

TextIO.write().to(String filenamePrefix))

Однако, используя версию выпуска 2.12.0, я смог записать в файл на том же диске, используя «/» в качестве корневого каталога, т.е. вместо «C: / myDirectory / myFile» я использовал «/ myDirectory / myFile. ". Конечно, таким образом вы можете записывать только файлы на том же диске, но, учитывая, что DirectRunner следует использовать только для тестирования, во многих случаях этого может быть достаточно.

person llatrbng    schedule 08.05.2019