【发布时间】: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