【数仓建模过程】Spark数据清洗篇

1. 环境准备

首先,确保你有适当的Spark环境。你可以使用Spark SQL、Spark DataFrame API或Spark RDD API来处理数据。对于数据仓库任务,通常推荐使用Spark SQL或DataFrame API,因为它们更适合结构化数据处理。

2. 数据读取

从ODS层或其他数据源读取数据。Spark支持多种数据源,如Hive表、HDFS文件、关系型数据库等。

from pyspark.sql import SparkSession

# 创建SparkSession
spark = SparkSession.builder \
    .appName("DWD Data Processing") \
    .enableHiveSupport() \
    .getOrCreate()

# 从ODS层读取数据
ods_data = spark.sql("SELECT * FROM ods.your_table")

2. 数据质量检查

在进行数据清洗之前,我们应该先检查数据质量,以了解数据的现状。

from pyspark.sql.functions import col, count, when, isnan, isnull

# 检查每列的空值和NaN值
null_nan_counts = ods_data.select([
    count(when(isnull(c) | isnan(c), c)).alias(c + '_null_or_nan_count')
    for c in ods_data.columns
])

# 计算空值和NaN的百分比
total_count = ods_data.count()
null_nan_percentages = null_nan_counts.select([
    (col(c) / total_count * 100).alias(c + '_null_or_nan_percentage')
    for c in null_nan_counts.columns
])

# 显示结果
null_nan_counts.show()
null_nan_percentages.show()

# 检查唯一值
unique_counts = ods_data.agg(*[countDistinct(col(c)).alias(c + '_distinct_count') for c in ods_data.columns])
unique_counts.show()

3. 数据清洗和转换

基于数据质量检查的结果,我们可以更有针对性地进行数据清洗和转换。

from pyspark.sql.functions import col, when, count, lit
from pyspark.sql.types import IntegerType

# 计算每行的非空值数量
row_counts = ods_data.select([
    (count(when(~(isnull(c) | isnan(c)), c)) / len(ods_data.columns)).alias('non_null_ratio')
    for c in ods_data.columns
])

# 设定一个阈值,例如要求至少50%的列有非空值
threshold = 0.5

# 筛选出满足条件的行
filtered_data = ods_data.withColumn('non_null_ratio', row_counts.non_null_ratio) \
                        .filter(col('non_null_ratio') >= threshold) \
                        .drop('non_null_ratio')

print(f"原始数据行数: {
     ods_data.count()}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值