我在Windows中使用Apache Beam通过DirectRunner运行WordCount程序。我可以看到输出文件是在temp文件夹中创建的(在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)
答案 0 :(得分:0)
Beam目前无法很好地处理Windows路径。参见相关的JIRA,例如this one。也许尝试使用file://
?
答案 1 :(得分:0)
摘要:您可以使用“ /”字符作为进程正在运行的驱动器的代表,例如如果您的输出文件位于
“ C:/ myFile”
写
TextIO.write().to("/myFile"));
更长的答案:
即使解决了jkff的答案(this one)中提到的问题,我也只能采用它们指定用于输入而不是用于输出的方式。
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版,我可以使用“ /”作为根目录写入同一驱动器上的文件,即我使用“ /”代替“ C:/ myDirectory / myFile” myDirectory / myFile”。当然,通过这种方式,您只能写入同一驱动器上的文件,但是鉴于DirectRunner仅应用于测试,因此在许多情况下这可能就足够了。