- 2
- 0
- 约2.8千字
- 约 3页
- 2025-07-02 发布于上海
- 举报
PySpark大数据清洗常用代码集锦
一、数据读取与初步处理
(一)数据加载与格式解析
PySpark支持从多种数据源(如CSV、JSON、Parquet)加载数据。例如,读取CSV文件时,需指定分隔符和列名:
df=spark.read.csv(path/to/file.csv,header=True,sep=,)
对于嵌套结构的JSON文件,可使用option(multiLine,True)处理复杂格式。若数据包含非法字符(如特殊符号或换行符),需使用escape参数或正则表达式过滤。
(二)列名标准化与类型推断
数据列名常存在大小写不一致或空格问题,可通过withColumnRenamed统一命名规范:
df=df.withColumnRenamed(old_column,new_column)
自动类型推断可能导致错误(如日期被识别为字符串),需手动指定模式:
frompyspark.sql.typesimportStructType,StructField,StringType,IntegerType
schema=StructType([
StructField(date,StringType(),True),
StructField(value,IntegerType(),True)
])
df=spark.read.csv(data.csv,schema=schema)
二、缺失值处理
(一)缺失值检测与统计
使用isNull()和count()统计每列缺失值数量:
frompyspark.sql.functionsimportcol
missing_stats=df.select([col(c).isNull().alias(c)forcindf.columns]).groupBy().sum()
missing_stats.show()
若某列缺失率超过阈值(如30%),可考虑直接删除该列。
(二)缺失值填充策略
对数值型列,常用均值或中位数填充:
frompyspark.sql.functionsimportmean
mean_value=df.select(mean(col(numeric_column))).collect()[0][0]
df_filled=df.na.fill(mean_value,subset=[numeric_column])
对分类变量,可用众数或自定义值(如”Unknown”)填充。复杂场景下,可结合窗口函数按时间或分组填充。
三、重复数据处理
(一)全列重复记录删除
使用dropDuplicates()删除完全相同的行:
df_unique=df.dropDuplicates()
若数据量较大,可通过repartition调整分区提升性能。
(二)基于关键字段的去重
按特定列去重并保留最新记录(如根据时间戳排序):
frompyspark.sql.windowimportWindow
window=Window.partitionBy(key_column).orderBy(col(timestamp).desc())
df_deduplicated=df.withColumn(rank,rank().over(window)).filter(col(rank)==1).drop(rank)
此方法适用于存在逻辑主键但多版本数据并存的情况。
四、数据转换与格式化
(一)字符串处理与正则表达式
清洗特殊字符或格式化文本:
frompyspark.sql.functionsimportregexp_replace
df_clean=df.withColumn(text_column,regexp_replace(col(text_column),[^a-zA-Z0-9],))
提取特定模式(如电话号码)时,可使用regexp_extract:
frompyspark.sql.functionsimportregexp_extract
df=df.withColumn(phone,regexp_extract(col(contact_info),(\\d{3}-\\d{4}),0))
(二)日期与时间格式化
转换异构日期格式(如”yyyy-MM-dd”与”dd/MM/yyyy”混用):
frompyspark.sql.functionsimportto_date
df=df.withColumn(date_column,to_
原创力文档

文档评论(0)