在 Oracle 数据库中使用 Python (Petl) 进行 ETL
你好,美好的一天! 👋
本博客旨在向大家展示或让大家了解如何进行提取、转换和将数据集加载到 Oracle 数据库中。 ETL过程可以通过多种方法完成,其中一种是使用Python。在这里,我们将通过一个名为“Petl”的包/工具来完成。对于这个过程,还有其他更受欢迎的工具,如 pandas、Mara 等,但我想给这个工具一些爱。因为,它对初学者来说简单易懂。
我们将在这里讨论所有这些,让我们开始吧,好吗?
我强烈建议你掌握一些python和数据库的基础知识,以便于理解
你需要什么?
1. Python:
很清楚,你应该有一个python环境设置。我建议将您的 python 目录添加到环境变量中,您可能会在本博客后面需要它。
2.甲骨文数据库:
因为,我们将处理 oracle 数据库,您应该将它安装在您的系统中。有大量关于如何安装和设置 oracle 数据库的视频和教程。您也可以查看官方网站。
3. SQL开发人员:
这个IDE将帮助您连接到数据库并执行 SQL 查询。加载数据后,您可以使用此平台查看您的表,并在提交之前查看所做的事务是对还是错。
设置数据库
一旦你拥有了所有你需要的东西并创建了你的数据库,就该创建一些表来加载数据了。如果我也和你们一起工作,这很容易理解,对吧?所以,我在我的数据库中创建了一个表😄
这是上表的SQL查询,
create table Bill (
cust_no varchar2(10) Not Null,
name varchar2(30) Not Null,
Order_no number(5) primary key,
Order_date date Not Null,
Item_no varchar2(15) Not Null,
Qnty number(10),
Total binary_float )
您可以直接在 SQL 开发人员中执行此查询,也可以使用我的存储库中的 python 脚本sqlexec.py
。这取决于你😃
配置文件
在数据库中创建表之后,让我们深入了解主要部分。
为了连接数据库,我们需要“username”、“password”、“host”、“port_id”等配置。
oracle = {
"user": "[username]",
"pass": "[password]",
"host": "[host_name/db_name]",
"port": "[port_no]"
}
使用您的配置编辑config.py
文件。添加所有值后,结果将如下所示
您可以将其他格式用于配置文件,例如
-
.ini
-
.xml
-
.json
-
.yml 或 .yaml
其中,.ini
是广泛用于编写配置文件的格式。
源数据集
现在没有数据就无法进行 ETL,对吗?因此,我为此创建了一个测试数据集test_dataset.xlsx
。您可以使用自己的数据集作为源文件,但在继续之前确保您的map.txt
文件具有正确的映射。
在本演练中,出于解释目的,我仅使用.xlsx
作为我的来源。
这是我使用的数据集,只有 10 条记录
映射源到目标
将数据从源表映射到目标数据库表是 ETL 中的关键部分。映射没有什么花哨的,它只是告诉程序将源中的哪一列存储在目标表的哪一列中,并定义数据将被转换和存储的不同条件(例如:数据类型、空/非空、计算、重复数据删除, ETC)。
我还创建了自己的映射文件map.txt
。您可以在etl.py
中定义自己的转换并在映射文件中使用。但我已经为您的知识编写了一些自定义转换。
例如:No.,Cust_no,str,Not Null,
,Name,Name,str,Not Null,upper
, ...
这里给出的详细解释👍
对于源文件和映射文件,我严格使用.xlsx
和.csv
。如果你们想看到一个接受不同文件格式并且可以在任何不同数据库上工作的程序,请随时告诉我😄
ETL
现在在完成所有先决条件之后,是时候进入主要部分了。
让我们运行etl.py
文件。语法是etl.py [source] [mapping_file] [target_table]
python etl.py test_dataset.xlsx map.txt bill
在 cmd prompt 中执行后,您可能会看到类似这样的输出。
如果有任何错误,它们将被记录在
\logs
目录中。
使用 SQL developer 查看数据库中的目标表时
您可能会看到第三行1GQD02, AIRBORNE SYSTEMS LTD...
上的Name
在目标表中为大写,而在源表中为小写,您是否注意到两个表之间的Order_Date
?您可能还会发现没有更少。目标表中的列数比源表中的...
“哇 😱,但是怎么做?🤔”,你可能会问。
好吧,这表明在将数据加载到目标表之前发生了一些转换。这些是我之前提到的自定义转换。而且我已经跳过了源表中的一些列,而不仅仅是在map.txt
文件中定义它们。很有趣,不是吗?
现在全是你...
您可以像上面提到的那样拥有自己的定义和转换......希望,您很清楚并从这个博客中获得了很多知识。如果您不熟悉编程或数据库概念,可能会有很多东西需要学习。不过没关系,别担心每个人都要从虚无开始,我也是🥺。所以,慢慢来,感受这个过程。
我在我的存储库中拥有所有可以使用和引用的 files 和 codes 。我已经在那里详细解释了一切。随时留下任何反馈,我对此持开放态度......😃
谢谢你们的时间,希望这个博客有用,想谈谈或有一些疑问?请接受特权...
你知道这是我写过的第一篇博客。我知道这不是最好的,但我为自己所做的一切感到自豪。
所以,在那之前,Peace and Cheers 🥂
更多推荐
所有评论(0)