ETL的过程
1、数据抽取:确定数据源,定义数据接口,选择数据抽取方法(主动抽取或由源系统推送)。
2、数据清洗:处理不完整数据、错误数据、重复数据等,确保数据的准确性和一致性。(是数据转换的一部分)
3、数据转换:进行空值处理、数据标准统一、数据拆分、数据验证、数据替换和数据关联等操作。
4、规则检查:根据业务需求进行数据质量和业务规则的校验。
5、数据加载:将数据缓冲区的数据加载到目标数据库或数据仓库中,可能是全量加载或增量加载。
3、数据转换(Transform)
负责对抽取的数据进行清洗、修正和转换,以满足目标系统的需求
数据转换的常用工具
Apache Spark
特点: 支持分布式计算,适合大规模数据处理,内置丰富的转换函数(如 map、filter、groupBy)。
适用场景: 大数据量的清洗、转换和聚合。
Apache NiFi
特点: 提供可视化界面,支持实时数据转换,内置多种处理器(如 ReplaceText、SplitJson)。
适用场景: 中小规模数据的实时转换。
Talend Open Studio
特点: 提供图形化界面,支持多种数据转换操作(如映射、拆分、聚合)。
适用场景: 快速开发和部署 ETL 流程。
Python (Pandas)
特点: 灵活易用,适合小规模数据的清洗和转换。
适用场景: 数据科学家或开发者的本地数据处理。
数据转换的工作流程
-
数据清洗与修正
- 删除重复记录:识别并删除重复的数据行。
- 处理缺失值:填充默认值或剔除缺失值。
- 标准化格式:统一日期、数字、文本等字段的格式。
-
数据转换操作
- 数据映射:将源字段与目标字段匹配。
- 数据拆分:将一个字段拆分为多个字段(如身份证号拆分为地区码、出生日期)。
- 数据聚合:对数据进行分组和计算(如按地区汇总销售额)。
-
数据验证
- 检查转换后的数据是否符合预期(如字段类型、数据范围)。
- 记录转换过程中的错误和警告。
-
数据输出
- 将转换后的数据保存到目标系统(如数据库、文件)。
数据转换的例子
假设我们有一个包含用户信息的 CSV 文件 users.csv,需要进行以下转换:
- 删除重复记录。
- 处理缺失值:将缺失的年龄字段填充为默认值
0
。 - 标准化格式:将日期字段统一为
YYYY-MM-DD
格式。 - 数据拆分:将身份证号字段拆分为地区码和出生日期。
- 数据聚合:按地区统计用户数量。
原始数据 (users.csv)
id | name | age | id_card | join_date |
---|---|---|---|---|
1 | Alice | 25 | 110105199001011234 | 2023-01-01 |
2 | Bob | 110108198512123456 | 2023-02-15 | |
3 | Charlie | 30 | 110105199001011234 | 2023-03-10 |
4 | David | 28 | 110107199505054321 | 2023-04-20 |
转换后的数据
id | name | age | id_card | join_date | region_code | birth_date | region | user_count |
---|---|---|---|---|---|---|---|---|
1 | Alice | 25 | 110105199001011234 | 2023-01-01 | 110105 | 1990-01-01 | 北京 | 2 |
2 | Bob | 0 | 110108198512123456 | 2023-02-15 | 110108 | 1985-12-12 | 北京 | 1 |
4 | David | 28 | 110107199505054321 | 2023-04-20 | 110107 | 1995-05-05 | 北京 | 1 |
使用 Python (Pandas) 实现
import pandas as pd
# 读取数据
df = pd.read_csv('users.csv')
# 1. 删除重复记录
df = df.drop_duplicates(subset=['id_card'])
# 2. 处理缺失值
df['age'] = df['age'].fillna(0)
# 3. 标准化日期格式
df['join_date'] = pd.to_datetime(df['join_date']).dt.strftime('%Y-%m-%d')
# 4. 数据拆分
df['region_code'] = df['id_card'].str[:6] # 提取地区码
df['birth_date'] = pd.to_datetime(df['id_card'].str[6:14], format='%Y%m%d').dt.strftime('%Y-%m-%d') # 提取出生日期
# 5. 数据聚合
df['region'] = '北京' # 假设所有用户都在北京
region_stats = df.groupby('region').size().reset_index(name='user_count')
# 输出结果
print(df)
print(region_stats)
使用 Apache Spark 实现
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, to_date, substring
# 创建 SparkSession
spark = SparkSession.builder.appName("DataTransform").getOrCreate()
# 读取数据
df = spark.read.csv('users.csv', header=True, inferSchema=True)
# 1. 删除重复记录
df = df.dropDuplicates(['id_card'])
# 2. 处理缺失值
df = df.fillna({'age': 0})
# 3. 标准化日期格式
df = df.withColumn('join_date', to_date(col('join_date'), 'yyyy-MM-dd'))
# 4. 数据拆分
df = df.withColumn('region_code', substring(col('id_card'), 1, 6)) # 提取地区码
df = df.withColumn('birth_date', to_date(substring(col('id_card'), 7, 8), 'yyyyMMdd')) # 提取出生日期
# 5. 数据聚合
df = df.withColumn('region', lit('北京')) # 假设所有用户都在北京
region_stats = df.groupBy('region').count().withColumnRenamed('count', 'user_count')
# 输出结果
df.show()
region_stats.show()
四、总结
数据转换的工具选择取决于数据规模、实时性需求和技术栈:
- 小规模数据:可以使用 Python (Pandas) 或 Talend。
- 大规模数据:推荐使用 Apache Spark 或商业工具(如 Informatica)。
- 实时数据处理:可以使用 Apache NiFi 或 Kafka Streams。
4、数据检查
这一步其实就是对数据清洗和转换后的数据进行进一步的检查
可以进行省略,根据业务所需,如果业务要求数据表的完整性必须高达 80%,就需要计算数据的完整性。
原文地址:码农小站
公众号:码农小站