【问题标题】:Better solution for High Performance ETL Flat File Extraction? [closed]高性能 ETL 平面文件提取的更好解决方案? [关闭]
【发布时间】:2012-10-16 20:51:26
【问题描述】:

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

[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​​ 代码更好的解决方案。

【问题讨论】:

    标签: ruby open-source etl text-parsing flat-file


    【解决方案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 取自one of the tests,它与this input file 一起运行。

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

    JRecordBind 有一个“流”方法(尽管它确实依赖于架构),因此内存消耗保持在最低限度。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2015-03-15
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多