SparkSQL数据清洗API
前面我们处理的数据实际上都是已经被处理好的规整数据,但是在大数据整个生产过程中,需要先对数据进行数据清洗,将杂乱无章的 数据整理为符合后面处理要求的规整数据
1. dropDuplicates()
dropDuplicates()
用于删除 DataFrame 中的重复行,特别是在某些列的值相同的情况下。它可以删除基于某些指定列的重复记录,也可以在整个 DataFrame 中去重。
用法:
# 不指定列,删除所有列都相同的重复行
distinct_df = df.dropDuplicates()
# 基于特定列删除重复行
distinct_df = df.dropDuplicates(["column1", "column2"])
示例: 假设你有一个 DataFrame:
name | age | city |
---|---|---|
Alice | 25 | New York |
Bob | 30 | Los Angeles |
Alice | 25 | New York |
执行 df.dropDuplicates()
后:
name | age | city |
---|---|---|
Alice | 25 | New York |
Bob | 30 | Los Angeles |
执行 df.dropDuplicates(["name", "age"])
后的结果相同,因为在 name
和 age
上两行是重复的。
适用场景:
- 删除重复数据记录,常用于数据清理时保证数据的唯一性。
- 可以指定要去重的列,灵活性高。
2. na.drop()
na.drop()
是专门用于处理缺失值的。na.drop()
删除 DataFrame 中包含缺失值的行。它可以作用于所有列,也可以作用于特定的列。
用法:
# 删除所有包含任何缺失值的行
clean_df = df.na.drop()
# 仅在特定列中删除包含缺失值的行
clean_df = df.na.drop(subset=["column1", "column2"])
# 可以指定删除策略,控制删除行为
clean_df = df.na.drop(how="any") # 默认,行中任意一列有 NaN 值就删除
clean_df = df.na.drop(how="all") # 只有当行中所有列都为 NaN 时才删除
clean_df = df.na.drop(thresh=2) # 至少有2个非NaN值才保留该行
示例: 假设你有一个 DataFrame:
name | age | city |
---|---|---|
Alice | 25 | New York |
Bob | null | Los Angeles |
Cathy | 30 | null |
执行 df.na.drop()
后:
name | age | city |
---|---|---|
Alice | 25 | New York |
执行 df.na.drop(subset=["city"])
后:
name | age | city |
---|---|---|
Alice | 25 | New York |
适用场景:
- 处理包含缺失值的数据,删除包含空值(
NaN
、null
)的行。 - 可以灵活选择处理哪一列的缺失值,或者设定删除策略如
how
或thresh
以决定何时删除行。
3. drapna()
drapna()
是 PySpark 中用于处理缺失数据的简化操作。这实际上是 na.drop()
的错误拼写(可能你指的是 df.dropna()
,它是 na.drop()
的快捷方法),它同样用于删除 DataFrame 中的缺失值行。
用法:
# 删除所有包含缺失值的行
clean_df = df.dropna()
# 仅删除特定列中有缺失值的行
clean_df = df.dropna(subset=["column1", "column2"])
# 控制删除行为
clean_df = df.dropna(how="any") # 默认,任意一列缺失值时删除该行
clean_df = df.dropna(how="all") # 只有当行中所有列缺失值时才删除
clean_df = df.dropna(thresh=2) # 至少有2个非缺失值的列才保留该行
示例: 假设你有一个 DataFrame:
name | age | city |
---|---|---|
Alice | 25 | New York |
Bob | null | Los Angeles |
Cathy | 30 | null |
执行 df.dropna()
后:
name | age | city |
---|---|---|
Alice | 25 | New York |
执行 df.dropna(subset=["city"])
后:
name | age | city |
---|---|---|
Alice | 25 | New York |
适用场景:
- 处理包含缺失值的数据,删除包含空值(
NaN
、null
)的行,功能与na.drop()
相同,只是写法更加简洁。
4. fillna()
fillna()
用于替换 DataFrame 中的缺失值。你可以为所有列或指定列填充默认值,支持不同数据类型的替换。
用法:
# 用指定的值填充所有列中的缺失值
filled_df = df.fillna(0) # 用 0 填充所有数值类型的列
filled_df = df.fillna("unknown") # 用 "unknown" 填充所有字符串类型的列
# 在特定列中填充缺失值
filled_df = df.fillna({"age": 0, "city": "unknown"}) # 为不同列指定不同的填充值
# 也可以用 df.na.fill() 进行同样的操作
filled_df = df.na.fill({"age": 0, "city": "unknown"})
示例: 假设你有一个 DataFrame:
name | age | city |
---|---|---|
Alice | 25 | New York |
Bob | null | Los Angeles |
Cathy | 30 | null |
执行 df.fillna({"age": 0, "city": "unknown"})
后:
name | age | city |
---|---|---|
Alice | 25 | New York |
Bob | 0 | Los Angeles |
Cathy | 30 | unknown |
适用场景:
- 在缺失值比较多的情况下,通过填充默认值保持数据完整性。
- 可以对不同的列使用不同的填充值,适应各种数据类型。
总结对比:
功能 | dropDuplicates() | na.drop() | dropna() | fillna() |
---|---|---|---|---|
作用 | 删除重复行(可以基于所有列或部分列) | 删除包含缺失值的行(可以针对特定列) | 删除包含缺失值的行(可以针对特定列) | 替换 DataFrame 中的缺失值 |
参数 | 可以指定列(subset 参数) | 可以指定列(subset 参数)、删除策略 | 可以指定列(subset 参数)、删除策略 | 可以指定列,并为其指定不同的填充值 |
典型使用场景 | 数据去重 | 处理缺失值 | 处理缺失值 | 填充缺失值,确保数据完整性 |
默认行为 | 基于所有列去重 | 删除任意含有 null 值的行 | 删除任意含有 null 值的行 | 用指定值替换所有缺失值 |
这四种方法解决不同的数据清洗问题:
dropDuplicates()
专注于去重,na.drop()
和dropna()
专注于删除缺失值的行,而fillna()
则用于替换缺失值。fillna()
在处理缺失数据时更加灵活,尤其在数据缺失较多的情况下,它可以帮助保持数据集的完整性。