本文分享自华为云社区《GaussDB数据库SQL系列-SQL与ETL浅谈》,作者:Gauss松鼠会小助手2。

一、前言

在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽取(Extract)、转换(Transform)和加载(Load)。但这些其实都脱离不了数据库系统,本节主要从GaussDB数据库生态出发,给大家简单讲一下SQL 与 ETL的过程与关系。

二、SQL与ETL的概述

SQL(结构化查询语言)

SQL是一种用于管理关系数据库系统的标准编程语言(例如、MySql、GaussDB等)。它用于查询、插入、更新和删除数据库中的数据。SQL语言主要用于数据库管理系统的交互,它并不是一种通用的编程语言,而是专门设计用于操作关系数据库的。

ETL(Extract-Transform-Load)

ETL是一个过程,用于从源系统提取数据,将其转换为目标系统所需的格式,然后将其加载到目标系统库。ETL是数据集成的一部分,用于将分散的、不一致的数据整合到一起,然后通过统一的接口将数据传输到目标系统库进行分析和应用。

ETL是数据库处理数据的重要环节,当在ETL过程中使用SQL时,通常涉及如下图操作。

三、ETL过程中的SQL示例(GaussDB)

本章节涉及到的SQL适用于GaussDB等数据库。

1、提取(Extract)

在ETL过程中,抽取是将数据从源系统中获取并传输到目标系统的第一步。这可能涉及到连接到数据库、读取文件、调用API等操作。在抽取数据时,需要考虑以下几个方面:

• 数据源的选择:根据具体业务需求选择数据源,并考虑数据量、数据质量、数据类型等因素。

• 抽取方式的选择:可以选择增量、全量更新等不同的抽取方式。

• 数据抽取的调度:需要考虑时间、频率、并发等因素,以确保数据的及时性和准确性。

常用SQL语句示例:

1)全量(表)提取

SELECT * FROM source_table;

2)增量提取(例如,根据日期字段,按天、月、年提取,或其他维度)

SELECT * FROM source_table WHERE t_date=’20230907’;

Tip:根据业务需求提取全字段或者指定字段。

2、转换(Transform)

在ETL过程中,转换是对抽取的数据进行清洗、转换、过滤和格式化等操作,以满足目标系统的需求。转换的主要操作包括:

• 数据清洗:包括去重、填充缺失值、异常值处理等操作,以确保数据的质量和准确性。

• 数据转换:包括数据类型转换、字段计算、格式化等操作,以使数据符合目标系统的数据结构和数据类型。

常用SQL语句示例:

1)数据行去重

--数据行去重(随机保留或者优先保留)

SELECT order_id, user, product, number

FROM (

SELECT *,

ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY proctime ASC) as row_num

FROM Orders)

WHERE row_num = 1;
参数说明: ROW_NUMBER(): 从第一行开始,依次为每一行分配一个唯一且连续的号码。 PARTITION BY col1[, col2...]: 指定分区的列,例如去重的键。 ORDER BY time_attr [asc|desc]: 指定排序的列。升序( ASC )排列指只保留第一行,而降序排列( DESC )则指保留最后一行。 WHERE rownum = 1: 取ROW_NUMBER()生成的编号1。

可参考上一篇文章:

https://blog.csdn.net/GaussDB/article/details/132752614

2)字段清洗(例如:去空格)

通过TRIM()、REPLACE()、CASE WHEN … THEN … END等关键字或函数进行异常字符处理。

--清洗空格

SELECT length(' 去空格 ')

,length(TRIM(' 去空格 '))     

,length(REPLACE(' 去空格 ',' ',''))

     ,length(CASE WHEN ' 去空格 ' <>'去空格' THEN '去空格' END);
说明: Trim(),通过去空格函数进行清洗 Replace(), 通过替换清洗 case when … then …end 与字典表比对进行清洗,此处的与字典表比对省略,具体根据业务需求进行。

3)非法日期清洗

创建日历表calendar,存储19000101到30001231的所有日期,通过比对判断是否为合规的日期格式。

--与字典表比对

SELECT *,CASE WHEN create_date NOT IN (SELECT c_date FROM calendar) THEN 0 ELSE 1 END status FROM T1
--剔除所有非法日期行 DELETE FROM T1 WHERE status =0;

Tip: 上文写法适合GaussDB等关系型数据库,且都是比较基础的示意说明,具体需要根据业务需要进行编写。

3、加载(Load)

在ETL过程中,加载是将转换后的数据加载到目标系统中,通常是数据仓库或数据集市。加载的主要操作包括:

• 数据映射。将转换后的数据映射到目标系统中,包括表、字段等。

• 数据加载。将转换后的数据加载到目标系统中,并进行数据校验、数据整合等操作。

常用SQL语句示例:

1)增量表(累加,字段、表一 一映射)

INSERT INTO target_table (column1, column2, column3) SELECT column1, column2, column3 FROM source_table;

2)全量表(全删全插,字段、表一 一映射)

--情况目标表

TRUNCATE table target_table;
--全量插入 INSERT INTO target_table (column1,column2,…) SELECT column1,column2,… FROM source_table;

3)作业重跑,清空指定分区数据,重新加载

• --清理表分区的数据

--清空分区etl_date

ALTER TABLE orders TRUNCATE PARTITION etl_date;

--或者清空分区etl_date=20230911。

ALTER TABLE orders TRUNCATE PARTITION for (20230911);
--插入新数据 INSERT INTO target_table (column1,column2,…,etl_date) SELECT column1,column2,…,etl_date FROM source_table;

Tip:数据加载涉及到的算法及表设计非常复杂,例如,涉及历史拉链表(关链、开链)、全量表(全删全插)、增量表(累加)等。设计时需要从数仓/数据集市的全局架构出发,确保合理、准确、高效等。

四、附DataArts Studio介绍

华为云GaussDB相关的生态工具DataArts Studio数据治理中心是一个强大的ETL工具和技术,它可以帮助开发人员设计、编写和管理ETL脚本。以下是DataArts Studio在这些方面的主要功能和优势:

• 可视化的ETL设计:DataArts Studio提供了一个直观的可视化界面,使开发人员能够以图形化方式设计和配置ETL流程。通过拖放组件和连接线,开发人员可以轻松定义数据提取、转换和加载的步骤,而无需编写复杂的代码。

• 内置的数据转换和处理功能:DataArts Studio提供了丰富的内置转换和处理组件,如数据清洗、数据格式转换、数据合并、数据计算等。开发人员可以直接使用这些组件,而无需自行编写转换逻辑,从而加快开发速度并减少错误。

• 强大的数据连接和集成能力:DataArts Studio支持与各种数据源的连接和集成,包括关系型数据库、文件系统、云存储、API接口等。开发人员可以轻松地配置数据源连接,并直接从这些数据源中提取数据。

• 可扩展的脚本编写和管理:虽然DataArts Studio提供了可视化的ETL设计界面,但它也支持自定义脚本编写。开发人员可以使用内置的脚本编辑器编写自定义的ETL脚本,以满足特定的需求。此外,DataArts Studio还提供了ETL脚本的版本控制和管理功能,方便团队协作和脚本的维护。

• 实时监控和调试:DataArts Studio提供了实时监控和调试功能,开发人员可以实时查看ETL流程的执行状态、数据处理的结果和错误信息。这有助于快速发现和解决问题,提高ETL脚本的质量和可靠性。

五、小结

SQL与ETL的关系在于,SQL语言通常用于ETL过程中的数据提取和转换阶段。通过使用SQL查询语句,可以从源数据库中提取所需的数据,然后使用SQL语句对数据进行必要的转换和处理,以便将其加载到目标系统。

当然了,现在好多企业都有专门的ETL工具,但其实后台都是通过类似“PYTHON + SQL”、“PERL + SQL”等方式实现的,其重点在于ETL过程中的SQL处理。 同样,在GaussDB数据库生态中也是不可或缺的,掌握GaussDB数据库相关的SQL写法必不可少。

点击关注,第一时间了解华为云新鲜技术~

细说SQL与ETL之间的小秘密的更多相关文章

  1. 不同SQL Server数据库之间的跨数据库查询

    --不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...

  2. 如何向小姐姐解释SQL和NoSQL之间的区别

    最近,在Medium上出现了一个采访问题:如何向奶奶解释SQL和NoSQL之间的区别.我认为作者使用自己的结构化家谱来比较sql和nosql之间的差异.写作非常好,但是有点尴尬.面试官没有时间听你的话 ...

  3. SQL语句、PL/SQL块和SQL*Plus命令之间的区别

    SQL语句.PL/SQL块和SQL*Plus命令之间的区别   原文链接:https://blog.csdn.net/liuzhushiqiang/article/details/12320941 在 ...

  4. SQL,Linq,Lambda之间的转换练习

    1.查询Student表中的所有记录的Sname.Ssex和Class列. SQL:select sname,ssex,class from Students linq:from s in Stude ...

  5. [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

    原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Ser ...

  6. 细说SQL性能优化

    1:在进行多表关联时,多用where语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联,以使结果集数据量最小化2:在两张表进行关联时,应考虑可否使用右连接.以提高查询速度3:使用wh ...

  7. [转]细说SQL Server中的加密

    简介 加密是指通过使用密钥或密码对数据进行模糊处理的过程.在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在 ...

  8. PL/SQL 查找1-100之间的素数

    --实现查找1-100之间的素数 declare v_no ; --标记是第几个素数 v_number number; --表示1-100之间的数 v_num number; begin .. loo ...

  9. Sql Server 数据库之间如何进行跨网远程连接访问

    场景说明 现在有一台A电脑和一台B电脑,两台电脑都安装了Sql Server数据库,两台电脑不在一个局域网(我们考虑的是不同网络的两台数据库连接),比如A电脑在公司,B电脑在家里,现在我要在家里用B电 ...

  10. 细说SQL 连接

          连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句       也可以包含搜索条件,以进一步筛选连接条件所选的行.         ...

随机推荐

  1. 自定义MyBatis拦截器更改表名

    by emanjusaka from ​ https://www.emanjusaka.top/archives/10 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址. 自定义MyBati ...

  2. Kubernetes网络

    kubernetes-Service 1.service存在的意义 1.防止破的失联(服务发现) 2.定义一组pod的访问策略(提供负载均衡) 2.pod与service的关系 1.通过lablel- ...

  3. P7072 [CSP-J2020] 直播获奖

    Problem 考查知识点:桶优化. 题目简述 竞赛的获奖率为 \(w\%\),即当前排名前 \(w\%\) 的选手的最低成绩就是即时的分数线. 若当前已评出了 \(p\) 个选手的成绩,则当前计划获 ...

  4. Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总

    http://blog.csdn.net/xiaohulunb/article/details/20729261

  5. DocTemplateTool - 可根据模板生成word或pdf文件的工具

    你是否经常遇到这样的场景:产品运营有着大量的报告需求,或者给客户领导展现每周的运营报告?这些文档类的任务可以交给运营同事,他们负责文档排版和样式,你作为开发人员你只需要提供数据源,和一个映射表,告诉制 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (131)-- 算法导论11.2 3题

    三.用go语言,Marley 教授做了这样一个假设,即如果将链模式改动一下,使得每个链表都能保持已排好序的顺序,散列的性能就可以有较大的提高.Marley 教授的改动对成功查找.不成功查找.插入和删除 ...

  7. JavaScript高级程序设计笔记12 BOM

    BOM BOM的核心--window对象 窗口和弹窗 location对象--页面信息 navigator对象--浏览器信息 history对象--浏览器历史记录 BOM是使用JavaScript开发 ...

  8. L3-002 特殊堆栈

    #include <bits/stdc++.h> using namespace std; const int N = 1E5 + 10; int tr[N]; stack<int& ...

  9. C++ LibCurl实现Web指纹识别

    Web指纹识别是一种通过分析Web应用程序的特征和元数据,以确定应用程序所使用的技术栈和配置的技术.这项技术旨在识别Web服务器.Web应用框架.后端数据库.JavaScript库等组件的版本和配置信 ...

  10. python中pip下载慢或报错的解决方法

    一:问题 python的pip在安装包时,有时会报错超时,排除包名写错的原因,一般这种问题是因为网络下载过慢,导致超时 二:解决方案 我们可以设置pip镜像源下载,能够提升pip下载速度,解决报错问题 ...