python 在Spark Dataframe的Array类型的列中将空字符串替换为None

gev0vcfq  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(119)

假设你有一个看起来像下面这样的dataframe:
| 列A|列B|列C|列D|
| --|--|--|--|
| 'test1'| 7 |['','hi ','']|['','',0]|
| “的一声| 14 |['','',6,'']|[98,0,'',9]|
有没有办法用None/null替换数组列(C和D)中的所有空字符串?它最终看起来像下面这样:
| 列A|列B|列C|列D|
| --|--|--|--|
| 'test1'| 7 |[嗨,嗨,嗨]|[Null,Null,0]|
| Null| 14 |[Null,Null,6,Null]|[98,0,Null,9]|
关键是我需要在每个数组中保留位置值,但我希望数组中有Null值而不是空字符串。
我已经能够使用以下代码将非数组的列转换为None:

df=df.select([F.when(F.col(c)=="",None).otherwise(F.col(c)).alias(c) for c in df.columns])

我在这里查看了databricks文档中的数组函数:https://docs.databricks.com/en/sql/language-manual/sql-ref-functions-builtin-alpha.html
使用array_remove()我可以删除数组中的所有空字符串,但同样的挑战是我需要用Null值保留每个数组的位置值。我不能只删除字符串而不替换值。有没有办法做到这一点?

nzk0hqpo

nzk0hqpo1#

你可以简单地使用transform函数对数组的每个元素应用spark转换:

df = spark.createDataFrame([
    (1, ["a", "", "b"]),
    (2, ["", "", "c"])
], ["id", "list"])
df.show()
+---+--------+
| id|    list|
+---+--------+
|  1|[a, , b]|
|  2| [, , c]|
+---+--------+
from pyspark.sql import functions as F
result = df.select(F.transform(F.col("list"),
    lambda x: F.when(x == "", F.lit(None)).otherwise(x)
  ).alias("list"))
result.show()
+---------------+                                                               
|           list|
+---------------+
|   [a, null, b]|
|[null, null, c]|
+---------------+

相关问题