从数组元素中删除子字符串并复制 pyspark
Remove sub-string from array elements and duplicate pyspark
我有一个 pyspark 数据框:
number | matricule
--------------------------------------------
1 | ["AZ 1234", "1234", "00100"]
--------------------------------------------
23 | ["1010", "12987"]
--------------------------------------------
56 | ["AZ 98989", "22222", "98989"]
--------------------------------------------
在 matricule
数组中,如果删除 AZ
字符串,我会得到重复值。
我想删除 "AZ"
字符串,然后删除 matricule
数组中的重复值。知道有时我在 AZ
之后有一个 space,我也应该将其删除。
我做了一个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
列中都为空。
如何从 matricule
数组中的每个值中删除 AZ,然后删除其中的重复项?
谢谢
你能不能把你的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))
对于 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
and trim
前导和尾随空格(如果有)。
我有一个 pyspark 数据框:
number | matricule
--------------------------------------------
1 | ["AZ 1234", "1234", "00100"]
--------------------------------------------
23 | ["1010", "12987"]
--------------------------------------------
56 | ["AZ 98989", "22222", "98989"]
--------------------------------------------
在 matricule
数组中,如果删除 AZ
字符串,我会得到重复值。
我想删除 "AZ"
字符串,然后删除 matricule
数组中的重复值。知道有时我在 AZ
之后有一个 space,我也应该将其删除。
我做了一个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
列中都为空。
如何从 matricule
数组中的每个值中删除 AZ,然后删除其中的重复项?
谢谢
你能不能把你的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))
对于 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
and trim
前导和尾随空格(如果有)。