使用 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 |
我做了一些 join
和 aggregations
如下
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")
),
我有这两个表
+---------+--------+ author_df
|AUTHOR_ID| NAME |
+---------+--------+
| 102 |Camus |
| 103 |Hugo |
+---------+-------- +------------ book_df
|AUTHOR_ID| BOOK_ID + BOOK_NAME |
+---------+-------- + -----------|
| 1 |Camus | Etranger
| 1 |Hugo | Mesirable |
我做了一些 join
和 aggregations
如下
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")
),