【问题标题】:Filter out struct of null values from an array of structs in spark dataframe从 Spark 数据帧中的结构数组中过滤出空值结构
【发布时间】:2021-11-20 03:00:49
【问题描述】:

我在一个数据框中有一个 col,它是一个结构数组。我想过滤掉一些带有所有空值的结构。例如使用以下数据框:

+—————+————————————————---------------------—+
|advertiser      |brands                     |
+—————+—————————————---------------------————+
Advertiser1      [{"id" : "a", "type" : "b", "name" : "c"}]
Advertiser2      [{"id" : null, "type" : null, "name" : null}]
+—————+————————————---------------------—————+

我想过滤掉具有空值的结构以获得:

+—————+———————————————---------------------——+
|advertiser      |brands                     |
+—————+————————————---------------------—————+
Advertiser1      [{"id" : "a", "type" : "b", "name" : "c"}]
Advertiser2      []
+—————+—————————————---------------------————+

如果我能想出一个空值结构,我想这就是这样的事情:

.withColumn(
    "brands",
    when(
        col("brands").equalTo(*emptyStruct?*),
            null
    )
)

【问题讨论】:

    标签: scala dataframe pyspark apache-spark-sql


    【解决方案1】:

    您想要过滤数组元素。从 Spark 3.0 开始,org.apache.spark.sql.functions 中有一个带有签名的方法:

    filter(column: Column, f: Column => Column): Column

    为你做这件事:

    df.select(
      col("advertiser"),
      filter(col("brands"),
             b =>
               b.getField("id").isNotNull
                 && b.getField("type").isNotNull
                 && b.getField("name").isNotNull) as "brands"
    

    使用 Spark 1.6+,您可以分解数组,过滤结构,然后按 advertiser 分组:

    df.select(col("advertiser"), explode(col("brands")) as "b").
      filter(
        col("b.id").isNotNull &&
          col("b.type").isNotNull &&
          col("b.name").isNotNull)
      .groupBy("advertiser").agg(collect_list("b") as "brands")
    

    【讨论】:

    • 嗯,语法似乎对我不起作用。我收到error: not found: value filter。应该是 col("brands").filter() 吗?
    • 这可能是您使用的 Spark 版本,因为错误意味着找不到该函数。我发布的答案适用于 Spark 3.+。
    【解决方案2】:

    您可以尝试使用 to_json 函数,所有 null 值的品牌将返回 [{}]。

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 2021-11-18
      • 1970-01-01
      • 2020-05-16
      • 2018-11-28
      • 1970-01-01
      • 2022-01-21
      • 2019-07-24
      • 2018-12-03
      相关资源
      最近更新 更多