Google cloud dataflow 如何在Google数据流中为Google云存储文件实现自定义文件解析器

Google cloud dataflow 如何在Google数据流中为Google云存储文件实现自定义文件解析器,google-cloud-dataflow,Google Cloud Dataflow,我在谷歌云存储中有一个自定义文件格式,我想从谷歌数据流中读取它 我已经通过子类化FileBasedReader实现了一个源代码和一个阅读器,但后来我意识到它不支持从Google云存储读取数据(而FileBasedSink实际上支持…),所以我不确定解决这个问题的最佳方法是什么 我试图对TextIO进行子类化,但由于它似乎并没有被设计成子类化,所以我无法就此结束 有什么好办法来解决这个问题吗 谢谢 更新以反映评论 使用的文件模式:gs://mybucket/my.json 从FileBasedSo

我在谷歌云存储中有一个自定义文件格式,我想从谷歌数据流中读取它

我已经通过子类化FileBasedReader实现了一个源代码和一个阅读器,但后来我意识到它不支持从Google云存储读取数据(而FileBasedSink实际上支持…),所以我不确定解决这个问题的最佳方法是什么

我试图对TextIO进行子类化,但由于它似乎并没有被设计成子类化,所以我无法就此结束

有什么好办法来解决这个问题吗

谢谢

更新以反映评论 使用的文件模式:
gs://mybucket/my.json

从FileBasedSource实现了源类:

MessageSource<T> extends FileBasedSource<T>
我遗漏了什么吗

第二次更新 运行
source.getEstimatedSizeBytes(选项)
时,它告诉我找不到处理程序

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?

从“第二次更新”中显示的堆栈跟踪中,看起来您已经直接从
main()
方法调用了
getEstimatedSizeBytes
。这将导致您看到的错误

标准URL方案处理程序在构建管道运行程序时注册。在示例代码中,当您调用
Pipeline.create(options)
(这将调用
PipelineRunner.fromOptions(options)
,其中注册了标准处理程序)时,就会发生这种情况


如果希望在运行管道以外的上下文中注册标准URL方案,可以显式调用
IOChannelUtils.registerStandardIOFactories()
。我应该注意的是,这不是一个受支持的API,但达到了一点“幕后”。因此,它可能随时发生变化。

Hmm,FileBasedReader绝对是用于谷歌云存储的。你能编辑你的问题来澄清你在使用它时遇到了什么问题吗?嗯。。。我可能错过了,但我在资料中看不到任何关于地面军事系统的参考?不管怎样,我遇到的问题是,在加载文件时不会触发错误。我不知道如何调试它。我还没有发现任何使用FileBasedReader做同样事情的示例。我将尝试更新问题,以反映您的评论@jkffYup,请更新问题的更多细节-没有这些我无能为力。事实上,几乎所有的源代码,包括TextIO,都是在后台使用FileBasedSource/Reader实现的。@jkff我已经更新了这个问题。这有助于让事情更清楚吗?事实上,我刚刚意识到我忘了更新那个问题,但是@jkff你是对的。它确实起了作用。我在代码的其他地方遇到了一个问题,整个过程都在默默地失败,但是最终文件被正确读取了。是的,你是正确的。谢谢你提供的细节。我后来意识到了这一点,并得到了谷歌的支持。遗憾的是,这与根本问题无关。
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>() {
    --source=gs://${BUCKET_NAME}/my.json \
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)