Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将包含美元符号($)的子字符串替换为其他列值_Regex_Apache Spark_Replace_Pyspark - Fatal编程技术网

Regex 将包含美元符号($)的子字符串替换为其他列值

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

我试图用每行“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'))

从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
我认为您需要转义反斜杠或使其成为原始字符串。