我正在寻找一种读取整个文件的方法,以便将每个文件完全读取为单个字符串。
我想在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>)
。