ETL系列-数据转换、规则检查(Transform)

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

1、ETL系列-数据抽取
2、ETL系列-数据清洗

3、数据转换(Transform)

负责对抽取的数据进行清洗、修正和转换,以满足目标系统的需求

数据转换的常用工具

Apache Spark
特点: 支持分布式计算,适合大规模数据处理,内置丰富的转换函数(如 map、filter、groupBy)。
适用场景: 大数据量的清洗、转换和聚合。

Apache NiFi
特点: 提供可视化界面,支持实时数据转换,内置多种处理器(如 ReplaceText、SplitJson)。
适用场景: 中小规模数据的实时转换。

Talend Open Studio
特点: 提供图形化界面,支持多种数据转换操作(如映射、拆分、聚合)。
适用场景: 快速开发和部署 ETL 流程。

Python (Pandas)
特点: 灵活易用,适合小规模数据的清洗和转换。
适用场景: 数据科学家或开发者的本地数据处理。

数据转换的工作流程

  1. 数据清洗与修正

    • 删除重复记录:识别并删除重复的数据行。
    • 处理缺失值:填充默认值或剔除缺失值。
    • 标准化格式:统一日期、数字、文本等字段的格式。
  2. 数据转换操作

    • 数据映射:将源字段与目标字段匹配。
    • 数据拆分:将一个字段拆分为多个字段(如身份证号拆分为地区码、出生日期)。
    • 数据聚合:对数据进行分组和计算(如按地区汇总销售额)。
  3. 数据验证

    • 检查转换后的数据是否符合预期(如字段类型、数据范围)。
    • 记录转换过程中的错误和警告。
  4. 数据输出

    • 将转换后的数据保存到目标系统(如数据库、文件)。

数据转换的例子

假设我们有一个包含用户信息的 CSV 文件 users.csv,需要进行以下转换:

  1. 删除重复记录
  2. 处理缺失值:将缺失的年龄字段填充为默认值 0
  3. 标准化格式:将日期字段统一为 YYYY-MM-DD 格式。
  4. 数据拆分:将身份证号字段拆分为地区码和出生日期。
  5. 数据聚合:按地区统计用户数量。

原始数据 (users.csv)

idnameageid_cardjoin_date
1Alice251101051990010112342023-01-01
2Bob1101081985121234562023-02-15
3Charlie301101051990010112342023-03-10
4David281101071995050543212023-04-20

转换后的数据

idnameageid_cardjoin_dateregion_codebirth_dateregionuser_count
1Alice251101051990010112342023-01-011101051990-01-01北京2
2Bob01101081985121234562023-02-151101081985-12-12北京1
4David281101071995050543212023-04-201101071995-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%,就需要计算数据的完整性。

原文地址:码农小站
公众号:码农小站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值