文本IO。使用模式 {} 从 GCS 读取多个文件

TextIO. Read multiple files from GCS using pattern {}

我尝试使用以下

TextIO.Read.from("gs://xyz.abc/xxx_{2017-06-06,2017-06-06}.csv")

那个模式不起作用,正如我得到的那样

java.lang.IllegalStateException: Unable to find any files matching StaticValueProvider{value=gs://xyz.abc/xxx_{2017-06-06,2017-06-06}.csv}

即使这 2 个文件确实存在。我尝试使用类似表达式

的本地文件
TextIO.Read.from("somefolder/xxx_{2017-06-06,2017-06-06}.csv")

而且效果很好。

我原以为 GCS 中的文件会支持各种 glob,但不支持。这是为什么?有什么地方可以实现我正在寻找的东西吗?

您尝试过 Apache Beam TextIO.Read from 功能吗? Here,它说 gcs 也是可能的:

public TextIO.Read from(java.lang.String filepattern)

Reads text files that reads from the file(s) with the given filename or filename pattern. This can be a local path (if running locally), or a Google Cloud Storage filename or filename pattern of the form "gs://<bucket>/<filepath>" (if running locally or using remote execution service).

Standard Java Filesystem glob patterns ("*", "?", "[..]") are supported.

全局模式在 Google 云存储与本地文件系统中的工作方式略有不同。 Apache Beam 的 TextIO.Read 转换将遵从底层文件系统来解释 glob。

记录了 GCS glob 通配符模式 here (Wildcard Names)

在上述情况下,您可以使用:

TextIO.Read.from("gs://xyz.abc/xxx_2017-06-*.csv")

但是请注意,这还将包括任何其他匹配文件。

除了 Scott 的建议和您对他的回答的评论之外,这可能是另一种选择:

您可以定义一个包含要读取的路径的列表,然后对其进行迭代,以通常的方式创建多个 PCollections:

PCollection<String> events1 = p.apply(TextIO.Read.from(path1));
PCollection<String> events2 = p.apply(TextIO.Read.from(path2));

然后创建一个PCollectionList:

PCollectionList<String> eventsList = PCollectionList.of(events1).and(events2);

然后将此列表展平到您的 PCollection 中作为您的主要输入:

PCollection<String> events = eventsList.apply(Flatten.pCollections());