我正在寻找一种读取整个文件的方法,以便将每个文件完全读取到单个字符串。 我想在 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>)
.
关于java - 云数据流: reading entire text files rather than lines by line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37667839/