如何设置一个空结构,所有字段为空,在火花中为空

Posted

技术标签:

【中文标题】如何设置一个空结构,所有字段为空,在火花中为空【英文标题】:How to set an empty struct with all fields null, null in spark 【发布时间】:2022-01-18 02:39:11 【问题描述】:

我有这个数据框:

+----+--------------------------------+
|name|dates                           |
+----+--------------------------------+
|A   |[[1994, 12, 11], [,,]]          |
|B   |[[1994, 12, 11], [1994, 12, 15]]|
+----+--------------------------------+

使用此架构:

root
 |-- name: string (nullable = true)
 |-- dates: struct (nullable = true)
 |    |-- start_date: struct (nullable = true)
 |    |    |-- year: integer (nullable = true)
 |    |    |-- month: integer (nullable = true)
 |    |    |-- day: integer (nullable = true)
 |    |-- end_date: struct (nullable = true)
 |    |    |-- year: integer (nullable = true)
 |    |    |-- month: integer (nullable = true)
 |    |    |-- day: integer (nullable = true)

我想把它作为输出 当end_date内的所有字段为null时,设置结束日期为null

+----+--------------------------------+
|name|dates                           |
+----+--------------------------------+
|A   |[[1994, 12, 11],]               |
|B   |[[1994, 12, 11], [1994, 12, 15]]|
+----+--------------------------------+

【问题讨论】:

【参考方案1】:

您可以通过从现有属性重新创建新结构来更新结构列dates,并使用when 表达式检查所有end_dates 属性是否为空:

val df2 = df.withColumn(
  "dates",
  struct(
    col("dates.start_date"), // keep start_date
    when(
      Seq("year", "month", "day")
        .map(x => col(s"dates.end_date.$x").isNull)
        .reduce(_ and _),
      lit(null).cast("struct<year:int,month:int,day:int>")
    ).otherwise(col("dates.end_date")).alias("end_date") // set end_date to null if all attr are null
  )
)

df2.show(false)
//+----+--------------------------------+
//|name|dates                           |
//+----+--------------------------------+
//|A   |[[1994, 12, 11],]               |
//|B   |[[1994, 12, 11], [1994, 12, 25]]|
//+----+--------------------------------+

【讨论】:

以上是关于如何设置一个空结构,所有字段为空,在火花中为空的主要内容,如果未能解决你的问题,请参考以下文章

在查询SQL语句中为空或不为空怎么写

如何在 Scenebuilder 中为空的 TextField 输入添加错误弹出窗口

arcgis10 如何设置字段可以为空

在目标 c 中使用 jsonModel 映射时将默认值设置为空字段

两个外键字段,正好一个被设置为一个值,另一个在 MySQL 数据库的 django 模型中为空

Laravel将DB字段设置为空数组