我想通过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
我希望我的工作能够处理20160209
,20160210
和20160211
目录中的文件,而不是20160208
(第一个)和{{1} } (最后)。实际上还有很多日期,我希望能够为我的工作指定一个任意的日期范围。
支持标准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上的临时位置。只有在读取和写入所有输入后,才开始实际处理。在我写作的工作中,这一步是完全没必要的。我希望这份工作能够读取第一个文件,开始处理它并阅读下一个文件,等等。
答案 0 :(得分:2)
文档确实意味着只支持*
,?
和[...]
。这意味着按字母或数字顺序排列的任意子集或范围不能表示为单个glob。
以下是一些可能适合您的方法:
Filter
转换来选择您感兴趣的日期范围。< / LI>
TextIO.Read
转换并展平它们对于小型文件集是可以的;我们的tf-idf example就是这么做的。 可以用少量的globs表示任意数值范围,因此每个文件不需要读取一次(例如,“23到67”这两个字符范围是2[3-]
加{{1加上[3-5][0-9]
)6[0-7]
并使用{{1}转换为读取每个文件并发出其内容。我希望这有帮助!