我正在寻找一种读取整个文件的方法,以便将每个文件完全读取为单个字符串。
我想在gs://my_bucket/*/*.json上传递JSON文本文件模式,使用ParDo然后完全处理每个文件。

最好的方法是什么?

最佳答案

我将给出最普遍有用的答案,即使在某些特殊情况下[1]您可能会做一些不同的事情。

我认为您想要做的是定义一个新的 FileBasedSource 子类并使用Read.from(<source>)。您的源代码还将包括FileBasedReader的子类;源包含配置数据,阅读器实际进行读取。

我认为最好将API的完整说明留给Javadoc,但我将重点介绍关键的替代点及其与您的需求的关系:

  • FileBasedSource#isSplittable()您将要覆盖并返回false。这将表明没有文件内分割。
  • FileBasedSource#createForSubrangeOfFile(String, long, long)您将重写以仅返回指定文件的子源。
  • 您将重写
  • FileBasedSource#createSingleFileReader()来为当前文件生成FileBasedReader(该方法应假定已将其拆分为单个文件的级别)。

  • 要实现阅读器:
  • FileBasedReader#startReading(...)您将覆盖不执行任何操作;框架已经为您打开了文件,它将关闭它。
  • FileBasedReader#readNextRecord()您将重写以将整个文件作为单个元素读取。

  • [1]一个简单的特殊情况示例是,当您实际上只有少量文件时,可以在提交作业之前将其扩展,并且它们都需要花费相同的时间来处理。然后,您可以只使用Create.of(expand(<glob>)),再使用ParDo(<read a file>)

    10-04 23:21