【发布时间】:2021-02-09 03:32:01
【问题描述】:
我有一个数据框,其中有一列是字符串数组。数组的某些元素可能会丢失,如下所示:
-------------|-------------------------------
ID |array_list
---------------------------------------------
38292786 |[AAA,, JLT] |
38292787 |[DFG] |
38292788 |[SHJ, QKJ, AAA, YTR, CBM] |
38292789 |[DUY, ANK, QJK, POI, CNM, ADD] |
38292790 |[] |
38292791 |[] |
38292792 |[,,, HKJ] |
我想用默认值“ZZZ”替换缺失的元素。有没有办法做到这一点?我尝试了以下代码,它使用了转换函数和正则表达式:
import pyspark.sql.functions as F
from pyspark.sql.dataframe import DataFrame
def transform(self, f):
return f(self)
DataFrame.transform = transform
df = df.withColumn("array_list2", F.expr("transform(array_list, x -> regexp_replace(x, '', 'ZZZ'))"))
这不会产生错误,但会产生废话。我在想我只是不知道识别数组缺失元素的正确方法 - 谁能帮帮我?
在生产中,我们的数据大约有 1000 万行,我试图避免使用 explode 或 UDF(不确定是否可以避免同时使用这两种方法,只需要代码尽可能高效地运行)。我正在使用 Spark 2.4.4
这是我希望输出的样子:
-------------|-------------------------------|-------------------------------
ID |array_list | array_list2
---------------------------------------------|-------------------------------
38292786 |[AAA,, JLT] |[AAA, ZZZ, JLT]
38292787 |[DFG] |[DFG]
38292788 |[SHJ, QKJ, AAA, YTR, CBM] |[SHJ, QKJ, AAA, YTR, CBM]
38292789 |[DUY, ANK, QJK, POI, CNM, ADD] |[DUY, ANK, QJK, POI, CNM, ADD]
38292790 |[] |[ZZZ]
38292791 |[] |[ZZZ]
38292792 |[,,, HKJ] |[ZZZ, ZZZ, ZZZ, HKJ]
【问题讨论】:
-
你试过类似 regexp_replace(x, '^(?![\s\S])', 'ZZZ') 吗?
-
@ggagliano,有趣的是,使用它会将 ZZZ 作为前缀添加到所有非缺失元素!
-
啊哈哈不错!然后试着去掉开头的^
-
UDF 的声明在这里不是真正的问题。
标签: arrays replace pyspark regexp-replace