首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ETL中避免T是可能的吗?

在ETL中避免T是可能的吗?
EN

Stack Overflow用户
提问于 2011-02-24 06:12:23
回答 1查看 420关注 0票数 1

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

示例

好的,让我给你举个例子。我有打印机,自动取款机和语音信箱系统。它们都有网络功能,或者我可以给你连接。您将如何从所有这些设备收集状态?例如,当您在端口9000上键入status时,打印机会转储文本文件:

代码语言:javascript
复制
> status
===============
has_paper:true
jobs:0
ink:low

当您连接到任意端口后,自动柜员机有一个CLI,您可以键入单独的命令来获取不同的值:

代码语言:javascript
复制
maint-mode> GET BILLS_1
[$1 bills]: 7
maint-mode> GET BILLS_5
[$5 bills]: 2
etc ...

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

代码语言:javascript
复制
telnet> 7,9*
0 new messages
telnet> 7,0*
2 total messages

我的想法

打印机-所以这是非常简单的。您可以在发送"status“之后捕获所有内容,分割成行,然后分割成冒号或其他东西。很简单。这几乎就像从web服务或其他地方获得一个垃圾格式的结果。我可以避免解析,只需从端口9000转储整个会话。但最终我会想要去掉等号的线。这并不意味着什么。

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

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

未来的证明

如果我要给你一个未知的设备呢?就像冰箱一样。或者烤面包机。或者其他什么?您必须提前编写“连接器”,或者在之后针对您先前存储的一些原始字段编写一个解析器。也许在这些非常有限的例子中,没有其他选择。没有办法预测未来。您只需理解新设备并在集合中解析它,或者在事实发生后解析它(您存储的blob/对象/文档)。

我在想,所有这些系统都是文本驱动的,所以也许你可以创建一个行迭代器类型的抽象层,它只需要设备拆分行。然后,您可以拥有一个根据规则进行解析的文本处理部分。对于自动柜员机设备,您必须编写一些“会使用自动柜员机”的代码,并将其转换为行,然后迭代器会处理这些行。此时,希望您能够说“我可以处理任何具有文本行的内容”。

但是,您将把这些解析文本的规则称为什么呢?“打印机规则”可以被称为“打印机解析器”,对我来说,这与“打印机转换”是一样的。有没有更好的术语来描述这一切?

我为这个问题如此开放而道歉。:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-24 06:53:03

当您的信息源与您所演示的信息源完全不同时,您别无选择,只能实现转换,以便将这些项带入一个公共数据存储库。通常,您的数据源不会如此极端,数据都会以某种方式相关,但您可能会从不同的源检索(一些可能来自结构良好的数据库,更多可能来自Excel、XML或文本文件,更多可能来自web服务调用,等等)。

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

现在,如果我给你一个未知的设备,

会怎么样呢?就像冰箱一样。或者烤面包机。

没问题,我只需要编写一个新的提供程序,它可以位于它自己的程序集(dll)中,这样它就可以独立地发送(或修改、升级等)给我已经拥有的任何其他提供程序。或者,如果我使用的是SSIS,那么我会编写一个新的DTS包。

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

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

,这样我就可以在数据收集时解析结果并计算出总数,或者直接存储它并在以后理解它。

对于您要抓取的数据,请使用任何有意义的方法。ETL进程将其数据转储到登台区域(如数据库中的一些临时表),而所有数据都在聚合和累积,然后对其进行进一步处理,以链接相关数据并执行计算,这也是很常见的。在您的自动柜员机的情况下,它可能没有必要计算在ETL时间的现金余额,因为您可以很容易地计算它在未来的任何时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5097867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档