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中的字符