从Dataflow中的文本文件处理多行事件

时间:2015-04-21 11:39:49

标签: google-cloud-dataflow

我正在尝试构建一个数据流管道来处理包含跨越多行的事件的文本文件。数据流SDK TextIO类假定每一行都是一个新事件。

我的计划是创建一个新的TextReader并将其注册到DataPipelineRunner。这个新读者将知道如何将多行聚合成一行。

我很确定这种方法可行,但我想知道这是否是正确的方法,或者是否有更简单的解决方案?

我想解析的文字是:

==============> len:45 pktype:4 mtype:2
SYMBOL: USOCSTIA151632.00
OPEN_INT: 212
PR_OPEN_INTEREST: 212
TIME_STAMP: 04/10/2015 06:30:17:420  val:1428661817

结果应该是连接在一起的最后4行,并且第一行被删除。

祝你好运, 彼得

1 个答案:

答案 0 :(得分:2)

请注意,TextReader是一个内部实现详细信息类,因此非常不鼓励对其进行子类化并且难以正确执行。

定义像您这样的基于文件的新格式的推荐方法是使用user-defined source API 子类FileBasedSource

在您的情况下,我建议您将课程基于文档中的LineIO示例,并将在那里定义的LineReader包装到您自己的类中,该类将使用LineReader作为读取单个行的帮助程序,但是:

  • startReading()中,它会跳到以" ====>"
  • 开头的行
  • readNextRecord()中,它会读取直到下一个" ====>"并将它们捆绑成一条记录。

请确保仔细阅读FileBasedSource和FileBasedReader的文档:并行化机制依赖于您所描述的格式必须满足的一致性属性,以确保在相邻处理分片之间的边界上不重复或省略记录。 XmlSource tests是如何对这些属性进行单元测试的一个很好的例子。

请告诉我们它是如何发生的,并报告任何问题或疑问 - 我们对此API的反馈非常感兴趣。