我有一个具有以下格式的数据集:
data = [{"Name":"John", "Family": "Doe}, {"Name":"Jack"}]
以及以下架构:
schema = StructType([StructField("Name", StringType(), False),
StructField("Family", StringType(), True)])
有什么方法可以在创建数据框期间创建默认值并给出架构?
df = spark_session.createDataFrame(data=data, schema=schema)
假设我想获得这样的东西
姓名 | 家人 |
---|---|
约翰 | 美国能源部 |
杰克 | 空 |
提前谢谢您
如果您指的是 DEFAULT 约束,它在未提供值时自动分配默认值,则 Spark 在创建 DataFrame 时在架构中不支持此操作。 Spark本身不支持像PRIMARY KEY这样的基本约束。但是,Databricks SQL(基于 Spark)确实提供了一些约束功能。这凸显了 Spark 主要专注于数据处理,而不是数据基础。
但是,您可以使用
fillna()
、coalesce()
或 when()
函数将 NULL 替换为其他值。例如:
df.na.fill({'family': 'default_family'})
# or
df.select(
when(df.family.isNull(),'default_family')
.otherwise(df.family).alias('family'), df.name)
物理计划表明
fillna()
实际上与 coalesce()
一样工作(不要与用于分区的混淆)。两者都返回给定列中的第一个非空值(请参阅从默认值创建的 lit()
列)。下面的例子应该有助于澄清这一点。
>>> df.na.fill({'family': 'default_family'}).explain()
== Physical Plan ==
*(1) Project [coalesce(family#238, default_family) AS family#394, name#239]
+- *(1) Scan ExistingRDD[family#238,name#239]
>>> df.select(coalesce(df.family, lit('default_family')).alias('family'), df.name).explain()
== Physical Plan ==
*(1) Project [coalesce(family#238, default_family) AS family#395, name#239]
+- *(1) Scan ExistingRDD[family#238,name#239]
此外,在读取 CSV 文件时,您可以考虑像
nullValue
这样的选项。