文本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());
我尝试使用以下
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());