组合 regexp_extract 和 regexp_replace 以屏蔽 pyspark 数据框列中的数字
Combine regexp_extract and regexp_replace to mask numbers in pyspark dataframe column
我有一个 PySpark DataFrame,df
像这样:
|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|123-45-6789 Broad Street|
|-----|-------|
我的正则表达式模式 r"\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}"
将过滤第 2 行。但是,我需要屏蔽匹配项,并且它必须是 1:1 匹配项。因此,在上面的示例中,更新后的值应该是 XXX-XX-XXXX Broad Street
,而不是 X Broad Street
。
像这样:
|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|XXX-XX-XXXX Broad Street|
|-----|-------|
我试过在 regexp_extract
调用上嵌套 regex_replace
调用,如下所示:
regexp_replace(regexp_extract(df["address"], "\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}", 0), "\d", "X")
但是,我收到一条错误消息,基本上表明我没有将字符串或类似字符串的对象传递给外部 regexp_replace 函数。
有没有办法结合 regexp_replace
和 regexp_extract
函数来更新子字符串?
试试这个方法。
from pyspark.sql import functions as F
df = sc.parallelize([
(1, "123 Apple Street"), (2 ,"123-45-6789 Broad Street")
]).toDF(["index", "address"])
df.show(truncate = False)
+-----+------------------------+
|index|address |
+-----+------------------------+
|1 |123 Apple Street |
|2 |123-45-6789 Broad Street|
+-----+------------------------+
df2 = df.withColumn("address", F.when(F.col('address').rlike("\d{3}-\d{2}-\d{4}|\d{3} \d{2} \d{4}"), F.regexp_replace(F.col('address'),r'\d','X')).otherwise(F.col('address')))
df2.show(truncate=False)
+-----+------------------------+
|index|address |
+-----+------------------------+
|1 |123 Apple Street |
|2 |XXX-XX-XXXX Broad Street|
+-----+------------------------+
我有一个 PySpark DataFrame,df
像这样:
|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|123-45-6789 Broad Street|
|-----|-------|
我的正则表达式模式 r"\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}"
将过滤第 2 行。但是,我需要屏蔽匹配项,并且它必须是 1:1 匹配项。因此,在上面的示例中,更新后的值应该是 XXX-XX-XXXX Broad Street
,而不是 X Broad Street
。
像这样:
|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|XXX-XX-XXXX Broad Street|
|-----|-------|
我试过在 regexp_extract
调用上嵌套 regex_replace
调用,如下所示:
regexp_replace(regexp_extract(df["address"], "\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}", 0), "\d", "X")
但是,我收到一条错误消息,基本上表明我没有将字符串或类似字符串的对象传递给外部 regexp_replace 函数。
有没有办法结合 regexp_replace
和 regexp_extract
函数来更新子字符串?
试试这个方法。
from pyspark.sql import functions as F
df = sc.parallelize([
(1, "123 Apple Street"), (2 ,"123-45-6789 Broad Street")
]).toDF(["index", "address"])
df.show(truncate = False)
+-----+------------------------+
|index|address |
+-----+------------------------+
|1 |123 Apple Street |
|2 |123-45-6789 Broad Street|
+-----+------------------------+
df2 = df.withColumn("address", F.when(F.col('address').rlike("\d{3}-\d{2}-\d{4}|\d{3} \d{2} \d{4}"), F.regexp_replace(F.col('address'),r'\d','X')).otherwise(F.col('address')))
df2.show(truncate=False)
+-----+------------------------+
|index|address |
+-----+------------------------+
|1 |123 Apple Street |
|2 |XXX-XX-XXXX Broad Street|
+-----+------------------------+