Regex 将包含美元符号($)的子字符串替换为其他列值
我试图用每行“NUMBER”列中的值替换子字符串“$NUMBER”。 我试过了Regex 将包含美元符号($)的子字符串替换为其他列值,regex,apache-spark,replace,pyspark,Regex,Apache Spark,Replace,Pyspark,我试图用每行“NUMBER”列中的值替换子字符串“$NUMBER”。 我试过了 从pyspark.sql.functions导入udf 从pyspark.sql.Types导入StringType 替换_udf=udf( lambda long_text,编号:long_text.替换(“$number”,编号), StringType() ) df=df.withColumn('long_text'),替换_udf(col('long_text')、col('number')) 及 从pys
从pyspark.sql.functions导入udf
从pyspark.sql.Types导入StringType
替换_udf=udf(
lambda long_text,编号:long_text.替换(“$number”,编号),
StringType()
)
df=df.withColumn('long_text'),替换_udf(col('long_text')、col('number'))
及
从pyspark.sql.functions导入expr
df=df.withColumn('long_text',expr(“regexp_replace(long_text,$NUMBER',NUMBER)”))
但什么都不管用。我不知道如何用另一列替换子字符串
样本:
df1=spark.createDataFrame(
[
(“哈哈哈,$这个数字不错”,3),
(“我不知道$NUMBER”,2),
($NUMBER在做什么?”,5)\
(“AJ$NUMBER”,2),
(“$NUMBER侏儒”,1)
],
[“长文本”、“数字”]
)
输入:
+---------------------------------+------+
|长文本|数|
+---------------------------------+------+
|哈哈哈,这个$3的数字不错|
|$NUMBER在做什么?|5|
|AJ$NUMBER | 2|
+---------------------------------+------+
预期产出:
+--------------------+------+
|长文本|编号|
+--------------------+------+
|哈哈哈,3号很好| 3号|
|5在干什么|
|AJ 123 | 2|
+--------------------+------+
回答者未涵盖栏目替换的类似问题:
在lambda中使用with replace之前,必须将数字列强制转换为str()字符串:
from pyspark.sql import types as T
from pyspark.sql import functions as F
l = [( 'hahaha the $NUMBER is good', 3)
,('what is $NUMBER doing?' , 5)
,('ajajaj $NUMBER ' , 2)]
df = spark.createDataFrame(l,['long_text','number'])
#Just added str() to your function
replace_udf = F.udf(lambda long_text, number: long_text.replace("$NUMBER", str(number)), T.StringType())
df.withColumn('long_text',replace_udf(F.col('long_text'),F.col('number'))).show()
+--------------------+------+
| long_text|number|
+--------------------+------+
|hahaha the 3 is good| 3|
| what is 5 doing?| 5|
| ajajaj 2 | 2|
+--------------------+------+
问题是,
$
在正则表达式中有一个特殊的含义,这意味着匹配行尾。因此,您的代码:
regexp\u替换(长文本,$NUMBER',NUMBER)
正在尝试匹配模式:行尾后跟文本字符串NUMBER
(它永远不会匹配任何内容)
为了匹配$
(或任何其他正则表达式特殊字符),必须使用\
对其进行转义
从pyspark.sql.functions导入expr
df=df.withColumn('long\u text',expr(“regexp\u replace(long\u text,\$NUMBER',NUMBER)”))
df.show()
#+--------------------+------+
#|长文本|编号|
#+--------------------+------+
#|哈哈哈,3号很好| 3号|
#|5在干什么|
#|阿贾杰2 | 2|
#+--------------------+------+
能否提供示例输入和预期输出?$
是正则表达式中的一个特殊符号,表示字符串末尾的匹配。您需要用斜杠转义:\$NUMBER
我认为您需要转义反斜杠或使其成为原始字符串。