如何使用Cloud Dataflow中的TextIO.Read将多个文件与名称匹配

时间:2018-02-09 06:34:54

标签: scala google-cloud-platform google-cloud-dataflow apache-beam spotify-scio

我有一个gcs文件夹,如下所示:

gs://<bucket-name>/<folder-name>/dt=2017-12-01/part-0000.tsv
                                /dt=2017-12-02/part-0000.tsv
                                /dt=2017-12-03/part-0000.tsv
                                /dt=2017-12-04/part-0000.tsv
                                ...

我想仅使用Scio中的dt=2017-12-02dt=2017-12-03匹配sc.textFile()下的文件,据我所知,它使用TextIO.Read.from()

我试过

gs://<bucket-name>/<folder-name>/dt={2017-12-02,2017-12-03}/*.tsv

gs://<bucket-name>/<folder-name>/dt=2017-12-(02|03)/*.tsv

两者都匹配零文件:

INFO org.apache.beam.sdk.io.FileBasedSource - Filepattern gs://<bucket-name>/<folder-name>/dt={2017-12-02,2017-12-03}/*.tsv matched 0 files with total size 0

INFO org.apache.beam.sdk.io.FileBasedSource - Filepattern gs://<bucket-name>/<folder-name>/dt=2017-12-(02|03)/*.tsv matched 0 files with total size 0

执行此操作的有效文件模式应该是什么?

2 个答案:

答案 0 :(得分:1)

您需要使用读取TextIO.readAll()文件模式的PCollection<String>转换。通过Create.of()显式创建文件模式集合,或者使用ParDo计算它。

case class ReadPaths(paths: java.lang.Iterable[String]) extends PTransform[PBegin, PCollection[String]] {
  override def expand(input: PBegin) = {
    Create.of(paths).expand(input).apply(TextIO.readAll())
  }
}

val paths = Seq(
  "gs://<bucket-name>/<folder-name>/dt=2017-07-01/part-0000.tsv",
  "gs://<bucket-name>/<folder-name>/dt=2017-12-20/part-0000.tsv",
  "gs://<bucket-name>/<folder-name>/dt=2018-03-29/part-0000.tsv",
  "gs://<bucket-name>/<folder-name>/dt=2018-05-04/part-0000.tsv"
)

import scala.collection.JavaConverters._

sc.customInput("Read Paths", ReadPaths(paths.asJava))

答案 1 :(得分:1)

这可能有效:

@Html.IdForModel()

参考:https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames