我在Google云端存储中有自定义文件格式,我想从Google DataFlow中读取它。
我通过继承FileBasedReader实现了Source和Reader,但后来我意识到它不支持从Google Cloud Storage读取(而FileBasedSink实际上是......)所以我不确定什么是最好的想法在这里解决......
我试图将TextIO子类化,但我无法达到目的,因为它似乎没有设计为子类。
关于如何处理的任何好主意?
感谢。
使用的文件模式:gs://mybucket/my.json
从FileBasedSource实现Source类:
MessageSource<T> extends FileBasedSource<T>
从FileBasedReader实现了Reader类(我真正关心的):
MessageReader<T> extends FileBasedReader<T>
阅读过程是:
MySource source = // instantiate source
Pipeline p = Pipeline.create(options);
p.apply(TextIO.Read.from(options.getSource()).named("ReadFileData"))
.apply(ParDo.of(new DoFn<String, String>() {
getSource()来自此命令行参数(已验证正确):
--source=gs://${BUCKET_NAME}/my.json \
我错过了什么吗?
在运行source.getEstimatedSizeBytes(options)
时,它告诉我没有找到处理程序?
java.io.IOException: Unable to find handler for gs://mybucket/my.json
at com.google.cloud.dataflow.sdk.util.IOChannelUtils.getFactory(IOChannelUtils.java:186)
at com.google.cloud.dataflow.sdk.io.FileBasedSource.getEstimatedSizeBytes(FileBasedSource.java:182)
at com.etc.TrackingDataPipeline.main(TrackingDataPipeline.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:745)
我认为FileBasedSource应该处理GCS?
答案 0 :(得分:3)
从您在&#34;第二次更新&#34;中显示的堆栈跟踪中,您似乎直接从getEstimatedSizeBytes
方法调用了main()
。这预计会导致您看到的错误。
构建管道运行器时会注册标准URL方案处理程序。在您的示例代码中,当您调用Pipeline.create(options)
时会发生这种情况(这会调用注册标准处理程序的PipelineRunner.fromOptions(options)
。)
如果您希望在运行管道之外的上下文中注册标准URL方案,则可以显式调用IOChannelUtils.registerStandardIOFactories()
。我应该注意到,这不是一个受支持的API,而是在引擎盖下#34;。因此,它可能随时发生变化。