Spark创建DataFrame时,如何为缺失列设置默认值?
问题解答
直接满足需求的情况
你想要的结果直接执行spark_session.createDataFrame(data=data, schema=schema)就能实现。
原因是你的Schema中Family字段的nullable参数设为True(允许为空),当原始数据的字典缺失该字段时,Spark会自动将对应行的Family列填充为null,执行后得到的DataFrame就是你期望的样子:
| Name | Family |
|---|---|
| John | Doe |
| Jack | null |
如果需要设置非null的默认值
如果希望给缺失列设置其他默认值(比如"Unknown"),可以通过两种方式实现:
方法1:预处理原始数据
遍历每个数据项,补全Schema中定义的所有字段,缺失字段设为指定默认值:
from pyspark.sql.types import StructType, StructField, StringType data = [{"Name":"John", "Family": "Doe"}, {"Name":"Jack"}] schema = StructType([StructField("Name", StringType(), False), StructField("Family", StringType(), True)]) # 预处理数据,补全缺失字段为指定默认值(这里用"Unknown"为例) processed_data = [] default_value = "Unknown" for item in data: processed_item = {field.name: item.get(field.name, default_value) for field in schema.fields} processed_data.append(processed_item) df = spark_session.createDataFrame(data=processed_data, schema=schema) df.show()
方法2:创建DataFrame后填充
先创建DataFrame,再用fillna或coalesce函数填充缺失值:
from pyspark.sql.functions import lit df = spark_session.createDataFrame(data=data, schema=schema) # 用fillna批量填充指定列的缺失值 df = df.fillna({"Family": "Unknown"}) # 或者用coalesce函数,将null替换为指定值 # df = df.withColumn("Family", df.Family.coalesce(lit("Unknown"))) df.show()
内容的提问来源于stack exchange,提问作者HouKaide
相关产品推荐
相关产品推荐

