写入Apache Beam中的文件

时间:2017-09-15 15:03:29

标签: apache-beam direct-runner

我在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)

2 个答案:

答案 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仅应用于测试,因此在许多情况下这可能就足够了。