2

我有一个结构如下的数据集:

[TIMESTAMP] FIXED POSITION       DATA STRING
[TIMESTAMP] FIXED POSITION       DATA STRING
[TIMESTAMP] tag1=9324, tag2=19, tag3=55, etc
[TIMESTAMP] FIXED POSITION       DATA STRING

这两种类型的记录混合在一起,基于标签的字段定期包含汇总数据。对于单个文件,这些数据文件可以大到 1000 万行。此外,一些固定位置的行可能有几千字节长 - 在我处理它们时会导致内存管理问题。

我需要从头开始处理文件,当我点击摘要条目时对每个条目进行分组,并记录这些摘要条目以及来自固定位置条目的某些字段的聚合。具体来说,固定位置段的一个特定部分包含一个 4 位的状态码。我需要将该数据添加到摘要记录中 - 自上次摘要记录以来出现的每个摘要代码的出现次数。每个摘要条目,包括汇总数据和时间戳的字段,都应转换为 CSV 中的一行。

我目前仅使用 ruby​​ 代码/标准库来执行此操作。对于较小的数据集,这很好,但对于较大的数据集,性能会迅速下降。在我看来,这似乎是一个常见的 ETL 类型问题。稍后我将对这些数据进行更复杂类型的操作,并且似乎会不断地重新访问这些日志文件以对它们进行更复杂的报告。

是否有现有的 ETL 工具或库(首选 Ruby)

  1. 高性能混合(正则表达式/固定位置)提取是否良好。
  2. 很容易学习。
  3. 抽象出内存管理。
  4. 是免费/开源或低成本(低于 200 美元)商业的。

我愿意接受关于使用什么来解决这个问题的替代建议——我只是在寻找比原始标准库 ruby​​ 代码更好的解决方案。

4

1 回答 1

1

我已经完成了一个 java 库调用http://jrecordbind.org/使用 xml 模式来定义输入/输出文件的格式

我想你的情况可以用“选择”元素的形式表达

<xs:complexType name="Choice">
<xs:choice>
  <xs:element name="one" type="One"/>
  <xs:element name="two" type="Two"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="One">
  <xs:sequence>
    <!-- fixed row definition -->
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Two">
  <xs:sequence>
    <!-- tag row definition -->
  </xs:sequence>
</xs:complexType>

这段 xsd 取自与此输入文件一起运行的测试之一

然后,您应该使用已解析的 java bean 并根据结果方法 getOne() 和 getTwo() 之一是否返回 null 来选择要执行的操作。

JRecordBind 具有“流”方法(即使它确实取决于模式),因此内存消耗保持在最低限度。

于 2012-10-18T09:43:42.740 回答