当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?

Posted

技术标签:

【中文标题】当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?【英文标题】:How to null a struct in Scala spark when all values in the struct are null? 【发布时间】:2020-11-13 16:07:25 【问题描述】:

我有一个 spark scala 数据框,其列是一个结构,当结构中的所有值都为空时,我想要 null 而不是对象。

val someDF = Seq(
  (8, null,null),
  (64, "mouse", "s"),
  (-27, "horse", "e")
).toDF("a", "b", "c")

def make_week_struct (week:String) : Column = 
  
   val summary = struct($"b", $"c").alias(s"wks_$week_jrny")
  
   return summary


val week1_summary = make_week_struct("1")

var dd = someDF.select($"a",week1_summary)

display(dd)

样本数据

a       b        c       
8       null     null
64      mouse    s    
-27     horse    e   

电流输出

a   wks_1_jrny
8   object:a:null, b:null
64  object:a:"mouse", b:"s"
-27 object:a:"horse", b:"e"

预期输出

a   wks_1_jrny
8   null
64  object:a:"mouse", b:"s"
-27 object:a:"horse", b:"e"

【问题讨论】:

您可以添加一些示例数据和预期输出吗?? @Srinivas 添加!!尽量简化,谢谢 实际数据集中的struct元素是否属于同一数据类型? 在我的示例中它们是,但我想要一个与类型无关的解决方案 @LeoC @SalsaSteve 将此问题标记为重复和违反行为 【参考方案1】:

你也可以使用to_json函数&过滤空json

scala> 

dd
.withColumn("wks_1_jrny",
              when(
                to_json($"wks_1_jrny") =!= "", // Filter Empty Json values.
                $"wks_1_jrny"
              )
            )
.show(false)

+---+----------+
|a  |wks_1_jrny|
+---+----------+
|8  |null      |
|64 |[mouse,s] |
|-27|[horse,e] |
+---+----------+

【讨论】:

【参考方案2】:

这也应该有效:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = List(
  (None, None),
  (None, Some("abc")),
  (Some(1), Some("xyz"))
).toDF("id", "name")

val structCols = Seq("id", "name")
val dataStruct = struct(structCols.map(col): _*)
val emptyStruct = struct(df.schema.fields.filter(f => structCols.contains(f.name)).map(f => lit(null).cast(f.dataType).as(f.name)):_*)

df
  .select(when(dataStruct.equalTo(emptyStruct), lit(null: StructType)).otherwise(dataStruct).as("col"))
  .show(false)

【讨论】:

一个包含多个操作的衬垫阅读起来很痛苦

以上是关于当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?的主要内容,如果未能解决你的问题,请参考以下文章

MSSQL - 仅当所有值都不为空时才插入值

PHP/MySQL:导入 CSV,所有日期和十进制值都为空,零

带有架构的 pyspark.sql SparkSession load() :架构中的非字符串类型字段使所有值都为空

SpringDataForCassandra:当数据库中的 Int 列设置为空时,实体中的 NullPointerEx

scala.MatchError:某个时间点之后的所有请求都为空

scala - 为啥map.size在地图不为空时返回0