1

我正在通过 DirectRunner 使用 Apache Beam 在 Windows 中运行 WordCount 程序。我可以看到在临时文件夹(在 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:无法在 org.apache.beam.sdk.io.FileSystems.getFileSystemInternal(FileSystems.java:447) at org.apache.beam 找到 i 的注册商.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)

4

2 回答 2

0

摘要:您可以使用“/”字符作为进程正在运行的驱动器的替代,例如,如果您的输出文件位于

“C:/我的文件”

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

更长的答案:

即使在 jkff 的答案(这个)中提到的问题得到解决后,我也只能让他们指定的方式用于输入,而不是用于输出。

LocalFileSystem类中的 javadoc说

 * <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,我能够通过使用“/”作为根目录来写入同一驱动器上的文件,即我使用“/myDirectory/myFile”而不是“C:/myDirectory/myFile” ”。当然,这种方式只能写入同一驱动器上的文件,但鉴于 DirectRunner 只应用于测试,这对于许多情况来说可能已经足够了。

于 2019-05-08T11:35:01.630 回答
0

Beam 目前不能很好地处理 Windows 路径。请参阅相关的 JIRA,例如这个。也许尝试使用指定绝对路径file://

于 2017-09-19T20:30:22.763 回答