在实际开发中,常常遇到多个 dataframe 关联(即 join)操作后,有些字段或列的值为 null 的情况,我们需要对列值为空进行填充数据,通过 dataframe.fillna() 或 dataframe.na.fill() 函数即可完成,fill 函数底层也是调用 fillna。
解决方式
这里列出了 fillna 函数填充指定列的示例:
from pyspark.sql import SparkSession
spark_session = SparkSession.builder \
.appName('knowledgedict-dataframe') \
.master('local') \
.getOrCreate()
df = spark_session.createDataFrame(
schema=['id', 'impression', 'click', 'ctr', 'city', 'content'],
data=[
(1, 100, 5, 0.05, 'beijing', ['product']),
(None, 10, 3, 0.3, 'beijing', ['product', 'article']),
(3, None, 5, 0.1, 'shanghai', ['article', 'person'])
]
)
df.show()
df = df.fillna({'id': 188})
df.show()
将 第二行 id 列为 null 的值,替换为字典映射的 188,输出如下:
+----+----------+-----+----+--------+------------------+ | id|impression|click| ctr| city| content| +----+----------+-----+----+--------+------------------+ | 1| 100| 5|0.05| beijing| [product]| |null| 10| 3| 0.3| beijing|[product, article]| | 3| null| 5| 0.1|shanghai| [article, person]| +----+----------+-----+----+--------+------------------+ +---+----------+-----+----+--------+------------------+ | id|impression|click| ctr| city| content| +---+----------+-----+----+--------+------------------+ | 1| 100| 5|0.05| beijing| [product]| |188| 10| 3| 0.3| beijing|[product, article]| | 3| null| 5| 0.1|shanghai| [article, person]| +---+----------+-----+----+--------+------------------+
fillna 函数具体形式如下:
def fillna(self, value, subset=None)
value 参数可以接收 int, long, float, string, bool 固定值设置,也可以接收映射字段设置的 dict 字典类型。
subset 参数主要和 value 的固定值设置一起使用,设置要起作用的字段,如果指定的字段类型和设置值的类型不匹配,该字段的设置忽略。