如何指定数据流作业的多个输入路径

时间:2016-03-02 07:07:42

标签: java glob google-cloud-dataflow

我想通过Google云端存储的多个输入运行数据流作业,但我想要传递给作业的路径不能仅使用* glob运算符指定。

考虑以下路径:

gs://bucket/some/path/20160208/input1
gs://bucket/some/path/20160208/input2
gs://bucket/some/path/20160209/input1
gs://bucket/some/path/20160209/input2
gs://bucket/some/path/20160210/input1
gs://bucket/some/path/20160210/input2
gs://bucket/some/path/20160211/input1
gs://bucket/some/path/20160211/input2
gs://bucket/some/path/20160212/input1
gs://bucket/some/path/20160212/input2

我希望我的工作能够处理201602092016021020160211目录中的文件,而不是20160208(第一个)和{{1} } (最后)。实际上还有很多日期,我希望能够为我的工作指定一个任意的日期范围。

The docs for TextIO.Read说:

  

支持标准Java Filesystem glob模式(" *","?"," [..]")。

但我无法让它发挥作用。这是指向Java Filesystem glob patterns 的链接,后者又链接到getPathMatcher(String),其中列出了所有通配选项。其中一个是20160212,它看起来与我需要的完全一样,但是,如果我将{a,b,c}传递给gs://bucket/some/path/201602{09,10,11}/*,我会得到&#34;无法扩展文件模式&#34;。< / p>

也许文档意味着只支持 TextIO.Read#from*?,如果是这样的话,我怎样才能构建一个数据流将接受并且可以匹配任意日期范围,如上所述?

更新:我已经发现我可以编写一大块代码,以便我可以将路径前缀作为逗号分隔列表传递,从中创建输入每个都使用[…]转换,但这似乎是一种非常低效的方式。看起来第一步是读取所有输入文件并立即将它们再次写入GCS上的临时位置。只有在读取和写入所有输入后,才开始实际处理。在我写作的工作中,这一步是完全没必要的。我希望这份工作能够读取第一个文件,开始处理它并阅读下一个文件,等等。这只会引起其他问题,我会尝试让它工作,但感觉就像一个由于最初的改写而死路一条。

1 个答案:

答案 0 :(得分:2)

文档确实意味着只支持*?[...]。这意味着按字母或数字顺序排列的任意子集或范围不能表示为单个glob。

以下是一些可能适合您的方法:

  1. 如果文件路径中表示的日期也出现在文件中的记录中,那么最简单的解决方案是全部读取它们并使用Filter转换来选择您感兴趣的日期范围。< / LI>
  2. 您尝试过多次读取的方法TextIO.Read转换并展平它们对于小型文件集是可以的;我们的tf-idf example就是这么做的。 可以用少量的globs表示任意数值范围,因此每个文件不需要读取一次(例如,“23到67”这两个字符范围是2[3-]加{{1加上[3-5][0-9]
  3. 如果文件子集更加随意,那么globs /文件名的数量可能超过最大图表大小,最后一个建议是将文件列表放入6[0-7]并使用{{1}转换为读取每个文件并发出其内容。
  4. 我希望这有帮助!