Удалить подстроку из элементов массива и дублировать pyspark - PullRequest
1 голос
/ 26 февраля 2020

У меня есть фрейм данных pyspark:

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

В matricule массиве, у меня есть дубликаты значений, если я удаляю AZ String. Я хотел бы удалить "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))

Я получил значение NULL во всех столбцах AZ_2.

Как можно удалить AZ из каждого значения в массиве matricule, а затем удалить дубликаты внутри? Спасибо

Ответы [ 2 ]

4 голосов
/ 26 февраля 2020

Для 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, мы удаляем AZ символов из начала строки, используя regexp_replace и trim начальные и конечные пробелы, если они есть.

2 голосов
/ 26 февраля 2020

Можете ли вы написать свой 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))
...