在 Spark 上的 CreateDataframe 期间提供架构时设置缺失列的默认值

问题描述 投票:0回答:1

我有一个具有以下格式的数据集:

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)

假设我想获得这样的东西

姓名 家人
约翰 美国能源部
杰克

提前谢谢您

apache-spark pyspark
1个回答
0
投票

如果您指的是 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
这样的选项。

© www.soinside.com 2019 - 2024. All rights reserved.