使用 Pyspark 收集列表时如何忽略空的 NullFields

How to ignore empty NullFields when collecting to list with Pyspark

我有这两个表

+---------+--------+ author_df
|AUTHOR_ID| NAME   |     
+---------+--------+
|  102    |Camus   |
|  103    |Hugo    |

+---------+-------- +------------  book_df
|AUTHOR_ID| BOOK_ID + BOOK_NAME  |     
+---------+-------- + -----------|
|  1      |Camus    | Etranger
|  1      |Hugo     | Mesirable  |

我做了一些 joinaggregations 如下

result_df = author_df.join(book_df, 'AUTHOR_ID', 'left')\
        .groupby('AUTHOR_ID', 'NAME')\
        .agg(f.collect_list(f.struct('BOOK_ID', 'BOOK_NAME')).alias('BOOK_LIST'))

我得到了一个具有这种结构的数据框

root
 |-- AUTHOR_ID: integer
 |-- NAME: string 
 |-- BOOK_LIST: array 
 |    |-- BOOK_ID: integer 
 |    |-- BOOK_NAME: string 

问题是当我想将 result_dataframe 写入 json 时,我在列表中得到空对象 {},例如

{
 ...
 "BOOK_LIST": [
   {}
 ]
}

即使我尝试了选项 ignoreNullFields

  result_df\
     .coalesce(1)\
     .write\
     .mode("overwrite")\
     .option("ignoreNullFields", "true")\     # this option
     .format("json")\
     .save(path)

但是我得到了一些我想要删除的空对象

```JSON
{
 ...
 "BOOK_LIST": [
   {
     "BOOK_ID": null,
     "BOOK_NAME": null
   }
 ]
}
In the resulted dataframe `result_df.show(truncate=False)`
```S
+---------+-----------------+ 
|         | BOOKS_LIST      |     
+---------+-----------------+
|         |[{null, null}]   |

那么如何删除具有空值的对象并获取空数组呢?谢谢

对于我们的案例

,我们只需要将条件 f.when().otherwise() 添加到我们的收集列表
 .agg(
      f.collect_list(
          f.when(f.col("BOOK_ID").isNotNull(), f.struct('BOOK_ID', 'BOOK_NAME')).otherwise(f.lit(None))).alias("BOOK_LIST")
      ),