首页 > 其他分享 >【数据仓库】— 5分钟浅谈 ETL(适合新手小白)

【数据仓库】— 5分钟浅谈 ETL(适合新手小白)

时间:2025-01-12 18:57:37浏览次数:3  
标签:抽取 浅谈 数据仓库 DB name 数据 ETL 加载

大家好,我是摇光~

在现在很多数据仓库和数据中台的系统中,都会涉及到 ETL,那么ETL到底是什么呢,我们来看看吧~

本文前面讲的是 ETL 的概念,后面会用一个实际案例来讲解 ETL。


一、ETL的基本概念

ETL是数据抽取(Extract)、转换(Transform)和加载(Load)的简称。

从字面意思来理解,其实ETL就是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库或数据中台中,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。

抽取、转换、加载说来简单,但是实际涉及到的事情很多,我们接下来看看 ETL 的整个过程。

二、ETL的过程

虽然 ETL 是抽取、转换、加载 三个步骤,但是由于涉及东西比较多,所以我们可以将步骤细分:

以下是ETL步骤:

  • 1、数据抽取:确定数据源,定义数据接口,选择数据抽取方法(主动抽取或由源系统推送)。
  • 2、数据清洗:处理不完整数据、错误数据、重复数据等,确保数据的准确性和一致性。
  • 3、数据转换:进行空值处理、数据标准统一、数据拆分、数据验证、数据替换和数据关联等操作。
  • 4、规则检查:根据业务需求进行数据质量和业务规则的校验。
  • 5、数据加载:将数据缓冲区的数据加载到目标数据库或数据仓库中,可能是全量加载或增量加载。

上面的步骤,很多都是抽象的,接下来用一个实际案例来理解。

三、ETL的实际案例

案例背景:

某公司使用多个不同的系统来存储不同部门的数据:

  • 如销售数据存储在CRM系统中,财务数据存储在ERP系统中,人力资源数据存储在HR系统中。
  • 为了更好地进行报告和分析,该公司决定将这些数据集成到一个统一的数据仓库中。

ETL过程:

1、数据抽取:(这里可以看是自己主动抽取数据,还是对方系统推送数据给你)

  • 从CRM系统中抽取销售数据。
  • 从ERP系统中抽取财务数据。
  • 从HR系统中抽取人力资源数据。

以下是一个示例Shell脚本,它使用sqlplus工具从源Oracle数据库(HR系统)中抽取数据,并将数据加载到目标Oracle数据仓库系统中。

请注意,这个脚本是一个基本示例,你可能需要根据实际情况进行调整。

#!/bin/bash

# 源数据库连接信息
SOURCE_DB_HOST="hr_system_host"
SOURCE_DB_PORT="1521"
SOURCE_DB_SID="hr_system_sid"
SOURCE_DB_USER="source_db_user"
SOURCE_DB_PASS="source_db_password"

# 目标数据库连接信息
TARGET_DB_HOST="data_warehouse_host"
TARGET_DB_PORT="1521"
TARGET_DB_SID="data_warehouse_sid"
TARGET_DB_USER="target_db_user"
TARGET_DB_PASS="target_db_password"

# 抽取数据的SQL查询
EXTRACT_QUERY="SELECT id, first_name, last_name, email, department_id, job_title FROM employees;"

# 临时文件用于存储从源数据库抽取的数据
TEMP_FILE="/tmp/employees_data.csv"

# 创建CSV文件的头部(可选,取决于目标表的结构)
echo "id,first_name,last_name,email,department_id,job_title" > "$TEMP_FILE"

# 从源数据库抽取数据并追加到CSV文件中(使用sqlplus的spool功能)
sqlplus -s "${SOURCE_DB_USER}/${SOURCE_DB_PASS}@${SOURCE_DB_HOST}:${SOURCE_DB_PORT}/${SOURCE_DB_SID}" <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SPOOL $TEMP_FILE APPEND
$EXTRACT_QUERY
SPOOL OFF
EXIT;
EOF

# 加载数据到目标数据库(使用SQL*Loader或INSERT语句,这里使用INSERT语句作为示例)
# 注意:在实际生产环境中,使用SQL*Loader通常更高效且更安全

# 为了使用INSERT语句,我们需要确保目标表结构与源查询结果相匹配
# 并且可能需要处理数据中的特殊字符(如单引号)以避免SQL注入风险
# 下面的示例脚本直接通过sqlplus执行INSERT语句,但这种方法在处理大量数据时可能效率不高
# 且存在SQL注入风险,因此仅作为示例提供

# 加载数据(使用INSERT语句的示例,不推荐用于生产环境)
while IFS=, read -r id first_name last_name email department_id job_title; do
    # 对特殊字符进行转义处理(这里仅对单引号进行简单处理,实际情况可能需要更复杂的逻辑)
    first_name=$(echo "$first_name" | sed "s/'/''/g")
    last_name=$(echo "$last_name" | sed "s/'/''/g")
    email=$(echo "$email" | sed "s/'/''/g")
    job_title=$(echo "$job_title" | sed "s/'/''/g")

    # 执行INSERT语句
    sqlplus -s "${TARGET_DB_USER}/${TARGET_DB_PASS}@${TARGET_DB_HOST}:${TARGET_DB_PORT}/${TARGET_DB_SID}" <<EOF
INSERT INTO employees (id, first_name, last_name, email, department_id, job_title)
VALUES ('$id', '$first_name', '$last_name', '$email', $department_id, '$job_title');
COMMIT;
EXIT;
EOF
done < "$TEMP_FILE"

# 清理临时文件
rm -f "$TEMP_FILE"

# 提示用户操作完成
echo "人员信息已成功从HR系统抽取并加载到数据仓库系统。"

注意:这个步骤的难点就是,每个系统可能有不同的数据格式和结构,因此需要编写不同的提取程序或查询来提取数据。

2、数据清洗

数据清理这个步骤的难点在于:需要对数据进行观察,处理不完整数据、错误数据、重复数据等问题。

我列举几个常见的例子:

  • 信息补全:比如人员信息表的地址不完全,可能需要人员证件表的地址信息进行数据填充
  • 格式错误:比如日期格式应该为:YYYYMMDD,结果真实数据是:YYYY/MM/DD,这种就需要统一格式
  • 重复数据:比如一张表中你只需要10个字段,但是源表有50个字段,你取的10个字段中,就有重复数据,这种就需要去重

3、数据转换

数据转换和数据清洗差不多,不过也有区分,数据转换主要做空值处理、数据标准统一、数据拆分、数据验证、数据替换和数据关联等操作。

我列举几个常见的例子:

  • 空值处理:比如个人信息表中,行业这个选项,很多人不选,但是系统可能为了保持数据完整性,就用个“其他”来表示。
  • 数据替换:比如性别,在系统中就不会存男女,而是会存 F/M 来表示

转换过程可以通过使用ETL工具(如Kettle)或编写自定义脚本来完成。

以下是一个非常基础的示例,实际的ETL过程可能涉及更复杂的转换逻辑和错误处理。

#!/bin/bash

# 输入和输出文件
INPUT_FILE="input_data.csv"
OUTPUT_FILE="transformed_data.csv"

# 创建输出文件,并写入头部(如果有)
echo "transformed_id,first_name,last_name,email,salary_usd" > "$OUTPUT_FILE"

# 处理每一行数据
while IFS=, read -r id raw_first_name raw_last_name raw_email salary_cents; do
    # 字段格式化:将salary_cents转换为美元(假设100 cents = 1 USD)
    salary_usd=$(echo "$salary_cents / 100" | bc)
    
    # 数据清洗:将姓名中的空格替换为下划线(仅为示例)
    first_name=$(echo "$raw_first_name" | tr ' ' '_')
    last_name=$(echo "$raw_last_name" | tr ' ' '_')
    
    # 验证email格式(这里使用简单的正则表达式,实际应用中可能需要更复杂的验证)
    if [[ "$raw_email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
        email="$raw_email"
    else
        # 如果email格式不正确,可以设置为默认值或进行其他处理
        echo "Invalid email format for ID $id: $raw_email" >&2
        email="unknown@$domain.com" # 假设有一个默认的域名
    fi
    
    # 将转换后的数据写入输出文件
    echo "$id,$first_name,$last_name,$email,$salary_usd" >> "$OUTPUT_FILE"
done < "$INPUT_FILE"

# 提示用户操作完成
echo "Data transformation completed. Output written to $OUTPUT_FILE."

4、数据检查

这一步其实就是对数据清洗和转换后的数据进行进一步的检查

可以进行省略,根据业务所需,如果业务要求数据表的完整性必须高达 80%,就需要计算数据的完整性。

5、数据加载:

数据加载主要就是将处理后的数据加载到目标数据库

其第一步已经包含了数据加载的代码,可以返回看看。

四、ETL的挑战与解决方案

尽管ETL技术在数据整合中发挥着重要作用,但在实施过程中也可能会面临一些挑战:

数据源的多样性和复杂性:

  • 不同的业务系统可能使用不同的数据库和数据格式,这增加了数据抽取和转换的难度。
  • 解决方案是建立统一的数据源管理系统,并对数据源进行标准化处理。

数据转换规则的复杂性:

  • 不同的业务系统可能使用不同的业务规则和数据模型,这需要在ETL过程中进行复杂的数据转换。
  • 解决方案是制定清晰的数据转换规则,并使用ETL工具或自定义脚本来实现这些规则。

数据加载的效率:

  • 当数据量非常大时,数据加载可能会成为瓶颈。
  • 解决方案是采用增量加载和并行处理等技术手段来提高数据加载的效率。

标签:抽取,浅谈,数据仓库,DB,name,数据,ETL,加载
From: https://blog.csdn.net/qq_41877371/article/details/145066452

相关文章

  • ETL 数据抽取
    ETLETL数据抽取ETL(Extract,Transform,Load)是数据集成和处理的重要过程,其中数据抽取(Extract)是第一步,负责从各种数据源中提取数据。以下是ETL数据抽取的详细说明和常用工具:1.数据抽取的方法1.1从数据库中提取数据使用SQL查询:对于像MySQL、Oracle和SQLServer......
  • ETL之kettle版本安装包免费下载地址
    想真正学习或者提升自己的ETL领域知识的朋友欢迎进群,一起学习,共同进步。由于群内人员较多无法直接扫描进入,公众号后台加我微信入群,备注kettle/hop。1、群里经常有小伙伴询问kettle安装包或者私下找我要,今天群里的三倍镜大佬分享了一个kettle全家桶版本,今天我整理下分享给大家。......
  • 学习- Nginx -浅谈Keepalived实现服务高可用的实现原理
    浅谈Keepalived实现服务高可用的实现原理一、原理两个Nginx服务器IP地址分别为192.168.44.111和192.168.44.112,对我们的应用服务器做负载均衡。为了保证服务高可用,在两台服务器上安装Keepalived软件(可以互相通信)。Keepalived会创建一个虚拟IP地址(vip-VirtualIPAddress),此......
  • 数据仓库(二):维度建模
    哈喽,大家好,我是Leven,在上一篇数据仓库(一):概述和大家普及了一些数据仓库中的基本概念,那么这篇文章我们详细说一说维度建模。我们先来聊一个ER关系图,也就是实体-关系模型,我相信大家对这个都比较清楚,但有时候会存在一个误区,就是将实体-关系等价于范式建模,其实维度建模也是可以......
  • 数据架构 | 逻辑数据仓库与物理数据仓库性能对比
    在逻辑数据湖和逻辑数据仓库方法中,数据虚拟化系统在多个数据源之上提供统一的查询访问和数据治理功能(见图1)。这些数据源通常包括一个或多个物理数据仓库、Hadoop集群、SaaS应用程序以及其他数据库。两种方法的主要区别在于:逻辑数据湖更强调Hadoop的作用,而逻辑数据仓库则更......
  • 学习 - Nginx -浅谈Nginx动静分离
    Nginx动静分离适用于中小型网站并发量不高的场景如下图所示Nginx方向代理的站点是一个Tomcat服务器其中存在很多的静态资源(jscssimg...)如果没有实现动静分离,每个用户在访问的时候都会重新加载一次CSS样式或者图片等,如果把静态资源放置到Nginx中,就不用每次都重新加载静态......
  • 浅谈异地访问家庭网络的几种方案
    家庭网络如何实现公网访问?想必是大家一直在探索的问题。本文带领大家一起来探究适合自己的解决方案吧!为什么要实现公网访问?要回答这个问题,每个人的答案或许不一样。但归纳在一起就是三个字爱折腾。在前面的文章中,我们讲到了如何将旧电脑打造属于自己的NAS,而如何远程访问却是一个......
  • .NET Core GC对象 分配(GC Alloc)底层原理浅谈
    对象分配策略.NET程序的对象是由CLR控制并分配在托管堆中,如果是你,会如何设计一个内存分配策略呢?按需分配,要多少分配多少,移动alloc_ptr指针即可,没有任何浪费。缺点是每次都要向OS申请内存,效率低预留缓冲区,降低了向OS申请内存的频次。但在多线程情况下,alloc_ptr锁竞争会非常......
  • 学习 - Nginx - 浅谈反向代理&正向代理
    一张图搞懂反向代理&正向代理反向代理客户端发送请求连接到互联网以后,不能直接访问到业务服务器(如Tomcat集群),需要通过Nginx反向代理才能访问,同理Tomcat返回报文数据的时候也不能直接返回给客户端,也需要通过Nginx才可以正向代理用户通过代理服务器(网关)访问外网......
  • 比较IOCTL和Netlink
    IOCTL(Input/OutputControl)和Netlink都是用于在用户空间和内核空间进行通信的机制,但它们在设计、使用方式以及适用场景上存在显著不同。下面对它们进行详细比较:IOCTL优点:1.简单性:IOCTL提供了一种直接的接口,可以通过系统调用`ioctl()`与设备或内核模块进行通信。对于简单的......