Google cloud storage TextIO。使用模式{}从GCS读取多个文件

Google cloud storage TextIO。使用模式{}从GCS读取多个文件,google-cloud-storage,glob,google-cloud-dataflow,apache-beam,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("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中的文件会支持各种各样的glob,但没有。为什么呢?有没有办法完成我想要的任务?

您是否尝试过Apache Beam
TextIO.Read from
函数,它说,地面军事系统也可以:

public TextIO.Read from(java.lang.String文件模式)

读取从具有给定文件名或文件名模式的文件中读取的文本文件。这可以是本地路径(如果在本地运行),也可以是谷歌云存储文件名或格式为“gs://”(如果在本地运行或使用远程执行服务)的文件名模式。


支持标准Java文件系统全局模式(“*”、“?”、“[…]”)。
全局模式在Google云存储中的工作方式与本地文件系统略有不同。Apache Beam的
TextIO.Read
转换将遵从底层文件系统来解释glob

记录了GCS全局通配符模式

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

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

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

除了Scott的建议和您对其答案的评论之外,这可能是另一个选项:

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

PCollection<String> events1 = p.apply(TextIO.Read.from(path1));
PCollection<String> events2 = p.apply(TextIO.Read.from(path2));
PCollection events1=p.apply(TextIO.Read.from(path1));
PCollection events2=p.apply(TextIO.Read.from(路径2));
然后创建一个PCollectionList

PCollectionList<String> eventsList = PCollectionList.of(events1).and(events2);
PCollectionList eventsList=PCollectionList.of(events1)和(events2);
然后将此列表展平到您的PCollection中,作为您的主要输入:


PCollection events=eventsList.apply(flatte.pCollections())

这就是我正在使用的。我正在考虑将文件列表传递给ParDo,但我不知道如何做:PSee@Matthias Baetens的伟大解决方案是分别读取这两个文件,然后将它们与
flatte.pCollections
合并。文档称它支持“标准Java文件系统全局绑定”但它似乎只支持这些
*匹配所有内容
?匹配任何单个字符,
[seq]匹配seq中的任何字符,
[!seq]匹配任何不在seq中的字符