菜单
本页目录

SparkSQL数据清洗API

前面我们处理的数据实际上都是已经被处理好的规整数据,但是在大数据整个生产过程中,需要先对数据进行数据清洗,将杂乱无章的 数据整理为符合后面处理要求的规整数据

1. dropDuplicates()

dropDuplicates() 用于删除 DataFrame 中的重复行,特别是在某些列的值相同的情况下。它可以删除基于某些指定列的重复记录,也可以在整个 DataFrame 中去重。

用法:

# 不指定列,删除所有列都相同的重复行
distinct_df = df.dropDuplicates()

# 基于特定列删除重复行
distinct_df = df.dropDuplicates(["column1", "column2"])

示例: 假设你有一个 DataFrame:

nameagecity
Alice25New York
Bob30Los Angeles
Alice25New York

执行 df.dropDuplicates() 后:

nameagecity
Alice25New York
Bob30Los Angeles

执行 df.dropDuplicates(["name", "age"]) 后的结果相同,因为在 nameage 上两行是重复的。

适用场景:

  • 删除重复数据记录,常用于数据清理时保证数据的唯一性。
  • 可以指定要去重的列,灵活性高。

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:

nameagecity
Alice25New York
BobnullLos Angeles
Cathy30null

执行 df.na.drop() 后:

nameagecity
Alice25New York

执行 df.na.drop(subset=["city"]) 后:

nameagecity
Alice25New York

适用场景:

  • 处理包含缺失值的数据,删除包含空值(NaNnull)的行。
  • 可以灵活选择处理哪一列的缺失值,或者设定删除策略如 howthresh 以决定何时删除行。

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:

nameagecity
Alice25New York
BobnullLos Angeles
Cathy30null

执行 df.dropna() 后:

nameagecity
Alice25New York

执行 df.dropna(subset=["city"]) 后:

nameagecity
Alice25New York

适用场景:

  • 处理包含缺失值的数据,删除包含空值(NaNnull)的行,功能与 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:

nameagecity
Alice25New York
BobnullLos Angeles
Cathy30null

执行 df.fillna({"age": 0, "city": "unknown"}) 后:

nameagecity
Alice25New York
Bob0Los Angeles
Cathy30unknown

适用场景:

  • 在缺失值比较多的情况下,通过填充默认值保持数据完整性。
  • 可以对不同的列使用不同的填充值,适应各种数据类型。

总结对比:

功能dropDuplicates()na.drop()dropna()fillna()
作用删除重复行(可以基于所有列或部分列)删除包含缺失值的行(可以针对特定列)删除包含缺失值的行(可以针对特定列)替换 DataFrame 中的缺失值
参数可以指定列(subset 参数)可以指定列(subset 参数)、删除策略可以指定列(subset 参数)、删除策略可以指定列,并为其指定不同的填充值
典型使用场景数据去重处理缺失值处理缺失值填充缺失值,确保数据完整性
默认行为基于所有列去重删除任意含有 null 值的行删除任意含有 null 值的行用指定值替换所有缺失值

这四种方法解决不同的数据清洗问题:dropDuplicates() 专注于去重,na.drop()dropna() 专注于删除缺失值的行,而 fillna() 则用于替换缺失值。fillna() 在处理缺失数据时更加灵活,尤其在数据缺失较多的情况下,它可以帮助保持数据集的完整性。