是否可以避免ETL中的T?

时间:2011-02-23 22:12:23

标签: etl

ETL非常普遍。数据在某处,所以你去了。获得它后,它可能是一种奇怪的格式,所以你将它转换成某种东西然后加载到某个地方。我用这种方法看到的唯一问题是你必须编写转换规则。当然,我想不出更好的事情。我想你可以把你得到的任何东西加载到一个blob(sql)或者加载到一个对象/文档(非sql)中但是我认为你只是在推迟解析。最终你必须将它解析成结构化的东西(假设你想要)。那有什么更好的吗?它有名字吗?这个问题有名字吗?

实施例

好的,我来举个例子。我有一台打印机,一台ATM和一个语音邮件系统。他们都启用了网络,或者我可以为您提供连接。您如何从所有这些设备中收集状态?例如,当您在端口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”并将其转换为迭代器随后会处理的行。在这一点上,希望你能够说“我可以处理任何有文本行的东西”。

但是,您会将这些规则称为解析文本的内容吗? “打印机规则”也可称为“打印机解析器”,这对我来说与“打印机转换”相同。所有这一切都有一个更好的术语吗?

我很抱歉这个问题如此开放。 :)

1 个答案:

答案 0 :(得分:2)

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

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

  

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

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

  

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

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

  

所以我可以解析结果并计算数据收集时的总数,或者只是将其存储起来并在以后理解它。

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