从数组元素中删除子字符串并重复pyspark

3

I have a pyspark dataframe:

number  |  matricule      
--------------------------------------------
1       |  ["AZ 1234", "1234", "00100"]                   
--------------------------------------------
23      |  ["1010", "12987"]                   
--------------------------------------------
56      |  ["AZ 98989", "22222", "98989"]                   
--------------------------------------------

matricule数组中,如果我去掉字符串"AZ",就会有重复的值。 我希望先删除"AZ"字符串,然后再从matricule数组中删除重复的值。有时候,在AZ之后会出现一个空格,我也应该将其删除。 我已经创建了一个UDF:
def remove_AZ(A)
    for item in A:
        if item.startswith('AZ'):
            item.replace('AZ','')
udf_remove_AZ = F.udf(remove_AZ)
df = df.withColumn("AZ_2", udf_remove_AZ(df.matricule))

我在所有的 AZ_2 列中得到了null。

我应该如何从 matricule 数组的每个值中删除AZ,然后再删除重复项呢? 谢谢。

2个回答

7

对于Spark 2.4+,您可以使用transform + array_distinct函数,如下所示:

t = "transform(matricule, x -> trim(regexp_replace(x, '^AZ', '')))"
df.withColumn("matricule", array_distinct(expr(t))).show(truncate=False) 

#+------+--------------+
#|number|matricule     |
#+------+--------------+
#|1     |[1234, 00100] |
#|23    |[1010, 12987] |
#|56    |[98989, 22222]|
#+------+--------------+

对于数组的每个元素,使用 transform,我们使用regexp_replace从字符串开头删除AZ字符,并trim前导和尾随空格(如果有的话)。


4

你能写出如下的UDF吗:

def remove_az(array):
    array = [w.replace('AZ', '').strip() for w in array]
    return array

remove_az_udf = F.udf(remove_az)

df = df.withColumn("AZ_2", remove_az_udf(df.matricule))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接