在作业执行之前过滤GCS URI

时间:2019-07-15 12:07:05

标签: google-cloud-storage google-cloud-dataflow apache-beam

我有一个无法解决的频繁使用案例。 假设我有一个像gs://mybucket/mydata/*/files.json这样的文件模式,其中*应该与日期匹配。

想象一下我想保留251个日期(这是一个例子,比方说,很多日期但没有像2019 *那样匹配它们的元模式)。 现在,我有两个选择:

  • 为每个单独的文件创建一个TextIO,这很过时并且几乎每次都会失败(图形太大)
  • 读取所有数据,然后从data中过滤掉我的工作中的数据:当您拥有10 TB的数据而仅需要10 Gb的数据时,这也是一个过分的选择

就我而言,我想做类似的事情(伪代码):

Read(LIST[uri1,uri2,...,uri251])

该指令实际上在图形上产生了一个TextIO任务。 很抱歉,如果我错过了一些事情,但是找不到解决方法。

谢谢

1 个答案:

答案 0 :(得分:1)

好吧,我找到了,命名在误导我:

Example 2: reading a PCollection of filenames.

 Pipeline p = ...;

 // E.g. the filenames might be computed from other data in the pipeline, or
 // read from a data source.
 PCollection<String> filenames = ...;

 // Read all files in the collection.
 PCollection<String> lines =
     filenames
         .apply(FileIO.matchAll())
         .apply(FileIO.readMatches())
         .apply(TextIO.readFiles());

(引自Apache Beam文档https://beam.apache.org/releases/javadoc/2.13.0/org/apache/beam/sdk/io/TextIO.html

因此,我们需要生成URIS的PCollection(带有Create/of)或从管道中读取它,然后匹配所有uri(或我猜想的模式)并读取所有文件。