暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GaussDB数据库SQL系列-SQL与ETL浅谈(上)

3246 2023-11-03
72

一、前言

在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等关系型数据库,且都是比较基础的示意说明,具体需要根据业务需要进行编写。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论