【问题标题】:Is avoiding the T in ETL possible?可以避免 ETL 中的 T 吗?
【发布时间】:2011-02-23 22:12:23
【问题描述】:

ETL 很常见。数据就在某个地方,所以你去获取它。在你得到它之后,它可能是一种奇怪的格式,所以你把它转换成某种东西,然后把它加载到某个地方。我看到这种方法的唯一问题是您必须编写转换规则。当然,我想不出更好的了。我想你可以将你得到的任何东西加载到一个blob(sql)或一个对象/文档(非sql)中,但我认为你只是在延迟解析。最终,您必须将其解析为结构化的内容(假设您愿意)。那么有没有更好的呢?它有名字吗?这个问题有名字吗?

示例

好吧,我给你举个例子。我有一台打印机、一台自动柜员机和一个语音邮件系统。它们都已启用网络,或者我可以为您提供连接。您将如何从所有这些设备中收集状态?例如,当您通过端口 9000 键入状态时,打印机会转储文本文件:

> status
===============
has_paper:true
jobs:0
ink:low

在您连接任何端口后,ATM 有一个 CLI,您可以键入单独的命令来获取不同的值:

maint-mode> GET BILLS_1
[$1 bills]: 7
maint-mode> GET BILLS_5
[$5 bills]: 2
etc ...

语音邮件系统需要特定的按键序列才能通过网络端口获取任何类型的信息:

telnet> 7,9*
0 new messages
telnet> 7,0*
2 total messages

我的想法

打印机 - 所以这很简单。您可以在发送“状态”后捕获所有内容,按行拆分,然后按冒号或其他内容拆分。相当容易。这几乎就像从 Web 服务或其他东西中获得废话格式的结果。我可以避免解析,只从端口 9000 转储整个对话。但最终我想摆脱那个等号线。这真的没有任何意义。

ATM - 所以这有点痛苦,因为它是交互式的。现在我正在接近期望或协议领域。如果他们有一个我可以查询这些值的服务会更好,但这超出了本文的范围。所以我编写了一个获取所有值的客户端。但现在如果我想收集所有数据,我必须定义所有问题是什么。例如,我知道 ATM 的钞票多于 1 美元和 5 美元,所以我有一个完整的清单,例如“BILLS_1 BILLS_5 BILLS_10 BILLS_20”。如果我问了所有问题,那么我就有了 ATM 机的库存。当然,如果我想弄清楚 ATM 机里还剩下多少钱,我仍然需要解析结果并清理文本。因此,我可以在数据收集时解析结果并计算出总数,或者将其原始存储并稍后理解。

语音邮件 - 这类似于 ATM 机,它是交互式的。这有点奇怪,因为键序列/命令不是“获取键”。但本质上是相同的问题和解决方案。

未来证明

如果我要给你一个未知设备怎么办?像冰箱一样。或者烤面包机。还是什么?您必须提前编写“连接器”,或者之后针对您之前存储的一些原始字段编写解析器。也许在这些非常有限的例子中,别无选择。没有办法保证未来。您只需要了解新设备并在收集时解析它或事后解析它(您存储的 blob/对象/文档)。

我在想所有这些系统都是文本驱动的,所以也许你可以创建一个线迭代器类型的抽象层,它只需要设备拆分线。然后你可以有一个基于规则解析的文本处理片段。对于 ATM 设备,您必须编写“说 ATM”的东西并将其转换为迭代器将处理的行。在这一点上,希望你能说“我可以处理任何有文本行的东西”。

但是,您将把这些用于解析文本的规则称为什么? “打印机规则”也可以称为“打印机解析器”,这对我来说与“打印机转换”相同。有没有更好的术语来形容这一切?

对于这个问题如此开放,我深表歉意。 :)

【问题讨论】:

    标签: etl


    【解决方案1】:

    当您的信息来源与您所说明的一样不同时,您别无选择,只能实施转换以将项目带入公共数据存储库。通常你的数据源不会这么极端,数据都会以某种方式相关,但你可能从不同的来源检索它(一些可能来自结构良好的数据库,更多可能来自 Excel 或 XML 或文本文件,更多的可能来自网络服务调用等)。

    在编写自定义 ETL 应用程序时,使用的常见模式是 Provider model,这使您能够编写一大堆自定义提供程序来加载/查询然后转换数据。所有的提供者都将使用一些相对通用的函数定义(例如QueryData()TransformData())实现一个通用接口,但是这些方法的实现会因所处理的数据源而大不相同with - 接口只是提供了一种处理所有不同提供者的通用方法。然后,您可以使用 XML 配置文件来指定要运行的提供程序以及它们可能需要的任何其他初始设置。 SSIS 之类的工具通过为您提供一个出色的视觉设计器,为您抽象出这些东西,但您仍然可以沉下心来编写自己的代码来调用它。

    如果我要给你一个未知设备怎么办?像冰箱一样。或者烤面包机。

    没问题,我只想编写一个新的提供程序,它可以位于自己的程序集 (dll) 中,因此可以将它单独运送(或修改、升级等)到我已经拥有的任何其他提供程序。或者如果我使用的是 SSIS,那么我会编写一个新的 DTS 包。

    我在想所有这些系统都是文本驱动的,所以也许你可以创建一个线迭代器类型的抽象层......然后你可以有一个基于规则解析的文本处理部分。

    当然 - 您可以拥有一个包含多个不同提供者可以实现的通用功能的基类,并且每个提供者都可以使用自己的一组规则,这些规则可以编码到其中,也可以包含在外部配置文件中。

    所以我可以在数据收集时解析结果并计算出总数,或者将其原始存储并稍后理解。

    使用对您获取的数据有意义的任何方法。 ETL过程也很常见,将其数据转储到一个暂存区(如数据库中的一些暂存表),同时数据全部被聚合和累积,然后进一步处理它以链接相关数据并执行计算。对于您的 ATM,可能不需要在 ETL 时计算现金余额,因为您可以在未来的任何时间轻松计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2020-06-19
      • 1970-01-01
      • 2010-10-01
      • 2019-01-10
      • 2013-09-24
      • 2011-07-05
      相关资源
      最近更新 更多