如何解决ETL 选择,构建一个直接处理 SQL 查询引擎impala或原生数据库的 ETL?
我正在尝试构建一个 ETL,将源表映射到一个维度的星型模式模型
我们的数据仓库基本上是在 Kudu 数据库之上的 Impala
我的问题是,我应该:
A- 构建一个直接使用 Python 处理 kudu 表的 ETL (link)
或
B- 或在impala 中创建UDF(相当于SQL 中的存储过程),执行插入/连接等操作以将源表映射到星型模式模型,并使用Nifi 或任何调度程序(例如Airflow 等)对其进行调度
在我看来,我认为最好处理原生数据库而不是处理其上的 SQL 引擎。但这只是一个假设。
解决方法
为什么不接近 C,:) 两者兼而有之。
两者各有利弊。
-
A - 使用 python 构建 ETL - 优点 - 更好的控制,灵活地执行您想要的任何逻辑。 缺点 - 你必须在 python 中编码,在 sql 中编码。如果某件事失败了,那么做 RCA 将是一场噩梦。相比之下,维护可能更难。 - 性能方面,如果数据量很大,这种方法会更差。
-
B - 使用 SQL 直接获取数据 - 优点 - 更快的性能。更少的编码。 缺点 - 难以实现复杂的逻辑。代码和时间表的维护可能很困难。
除上述之外,请考虑您/团队对 python/SQL 和未来可维护性的舒适度。
目前我们在我的 cloudera 项目中使用方法 B。我们创建视图,然后使用 insert
直接加载最终表。我们几乎不需要任何 UDF。
现在,我的建议是,请使用方法 B。只有在您确实无法创建复杂逻辑的情况下才使用方法 A。
编辑: 可以说,我们必须加载订单表。因此,我们执行以下块来加载订单和依赖的 org、cust、prod 表。
Load customer |
load org | --> Load Orders final.
load product |
load order stage|
加载客户块是脚本的集合,如-
insert overwrite cust_stg select * from cust_stg_vw; -- This loads into stage table
insert overwrite cust select * from cust_vw; -- This loads into cust table
类似地,其他块也被写入。将它们放在块中可以让我们灵活地将它们按任何顺序/任何我们想要提高性能的位置放置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。