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()}"