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

时间:2017-06-07 08:23:49

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

我尝试使用以下

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}

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

TextIO.Read.from("somefolder/xxx_{2017-06-06,2017-06-06}.csv")

这确实很有效。

我会认为GCS中的各种文件都会得到支持,但不会。这是为什么?在那里完成我正在寻找的东西?

3 个答案:

答案 0 :(得分:8)

这可能是另一种选择,除了斯科特的建议以及你对他的回答的评论:

您可以使用要读取的路径定义列表,然后对其进行迭代,以通常的方式创建多个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());

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:-3)

您是否尝试过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.