ETL 选择,构建处理 SQL 查询引擎 (impala) 或直接处理本机数据库的 ETL?

ETL choice, building an ETL that deals with SQL query engine (impala) or native database directly?

我正在尝试构建一个将源表映射到维度星型模式模型的 ETL

我们的数据仓库基本上是 Impala 在 Kudu 数据库之上

我的问题是,我应该:

A- 使用 Python (link)

构建直接处理 kudu 表的 ETL

B- 或在 impala 中创建 UDF(相当于 SQL 中的存储过程)执行 insertion/joins 等以将源表映射到星型模式模型,并对其进行调度使用 Nifi 或任何调度程序,例如 Airflow 等

在我看来,我认为处理本机数据库比处理其上的 SQL 引擎更好。但这只是一个假设。

为什么不接近 C,:)两者兼而有之。

两者各有利弊。

  • A - 使用 python 构建 ETL - 优点-更好的控制,可以灵活地执行您想要的任何逻辑。 缺点 - 你必须在 python 中编码,在 sql 中编码。如果某件事失败了,那么做 RCA 将是一场噩梦。相比之下,维护可能更难。 - 性能方面,这种方法在数据量很大的情况下会更差。

  • B - 使用SQL直接获取数据 - 优点 - 更快的性能。更少的编码。 缺点 - 难以实现复杂的逻辑。维护代码和进度可能很困难。

除上述之外,请考虑 your/teams 对 python/SQL 的舒适度和未来的可维护性。
目前我们在我的 cloudera 项目中使用方法 B。我们创建视图,然后使用 insert 直接加载最终的 tables。我们几乎不需要任何 UDF。
现在,我的建议是,请使用方法 B。只有在您确实无法创建复杂逻辑时才使用方法 A。

编辑: 比方说,我们必须加载订单 table。所以我们执行以下块来加载订单和相关的 org,cust,prod tables.

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

和其他块类似地写入。将它们放在块中使我们可以灵活地将它们放在我们想要提高性能的任何 order/anywhere 中。