当前位置: 首页 > 知识库问答 >
问题:

在Apache Beam/Dataflow Python流中写入文本文件

长孙正卿
2023-03-14

我有一个非常基本的Python Dataflow工作,从pub/sub读取一些数据,应用FixedWindow并写入Google Cloud Storage。

transformed = ...
transformed | beam.io.WriteToText(known_args.output)

输出被写入--output中特定的位置,但只写入临时阶段,即。

gs://MY_BUCKET/MY_DIR/beam-temp-2a5c0e1eec1c11e8b98342010a800004/...some_UUID...

当进一步测试时,我注意到streaming_wordcount示例也有同样的问题,但是标准wordcount示例写得很好。也许问题在于开窗,或者从PubSub阅读?

WriteToText似乎与PubSub的流源不兼容。可能有变通办法,或者Java版本可能兼容,但我选择使用完全不同的解决方案。

共有1个答案

袁志专
2023-03-14

Python SDK中的WriteToText转换不支持流。

相反,您可以考虑apache_beam.io.fileio中的转换。在本例中,您可以编写如下内容(假设窗口为10分钟):

my_pcollection = (p | ReadFromPubSub(....)
                    |  WindowInto(FixedWindows(10*60))
                    |  fileio.WriteToFiles(path=known_args.output))

这足以为每个窗口写出单独的文件,并随着流的前进继续这样做。

您将看到如下所示的文件(假设输出为gs://mybucket/)。当windows被触发时,文件将被打印出来:

gs://mybucket/output-1970-01-01T00_00_00-1970-01-01T00_10_00-0000-00002
gs://mybucket/output-1970-01-01T00_00_00-1970-01-01T00_10_00-0001-00002
gs://mybucket/output-1970-01-01T00_10_00-1970-01-01T00_20_00-0000-00002
gs://mybucket/output-1970-01-01T00_10_00-1970-01-01T00_20_00-0001-00002
...

默认情况下,这些文件具有$prefix-$start-$end-$pane-$shard-of-$numshards$suffix$compressionsuffix名称-其中prefix默认情况下是output,但是您可以传递一个更复杂的函数来命名文件。

如果您希望自定义文件的编写方式(例如文件的命名、数据的格式或类似的内容),可以查看WriteTofiles中的额外参数。

您可以在这里看到一个在Beam测试中使用的转换的示例,其中包含了更复杂的参数--但听起来默认行为对您来说应该足够了。

 类似资料:
  • 问题内容: 我正在从Google文档中提取数据,进行处理,然后将其写入文件(最终我将其粘贴到Wordpress页面中)。 它具有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号? 目前,我正在将所有内容都转换为,将它们全部合并为Python字符串,然后执行以下操作: 最后一行存在编码错误: 编解码器无法解码位置12286的字节:序数不在范围内(128) 部分解决方案:

  • 问题内容: 我在javascript中有一个JSON对象。我只想将JSON对象写入文本文件。到目前为止,从我遇到的情况来看,由于客户端的安全问题,无法这样做。有解决方法吗?如果最初放置一些虚拟值,是否可以修改已经存在的文件? 谢谢 问题答案: 您可以做的一件事就是将JSON设置为即时下载。 工作演示:http : //jsfiddle.net/sLq3F/ 除此之外,由于安全原因,您无法在客户端的

  • 问题内容: 我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在附加数据或创建文本文件,我的代码将不起作用。这是示例代码 再次打开它后,它似乎没有追加到下一行。 另外,我认为在两个用户同时登录的情况下也会出现错误,会影响打开文本文件并随后保存吗? 问题答案: 尝试这样的事情:

  • 问题内容: 因此,我正在使用 BufferedWriter, 并希望将一些文本写入文本文件。 由于某种原因,正在创建文本文档,但是没有写入任何文本,这是为什么呢? 问题答案: 您需要关闭或使用

  • 问题内容: 我需要在文本文件的开头写入一些内容。我有一个包含内容的文本文件,我想在此内容之前写点东西。说我有; 先生,下午好,今天好吗? 我很好你怎么样? 感谢您的询问,我很棒 修改后,我希望它像这样: Page 1-Scene 59 25.05.2011 先生,下午好,今天好吗? 我很好你怎么样? 感谢您的询问,我很棒 刚刚组成的内容:)我如何以这种方式修改文本文件? 问题答案: 您无法真正 通

  • 问题内容: 我正在尝试从文本文件中读取UTF8文本,然后将其中一些打印到另一个文件中。我正在使用Linux和gcc编译器。这是我正在使用的代码: 目前,它适用于英文字符。 问题答案: 这段代码对我有用: