如何使用pyspark中的regexp_replace函数获得理想的结果?

How to achieve desirable result using regexp_replace function in pyspark?

提问人:alka 提问时间:11/10/2023 最后编辑:alka 更新时间:11/13/2023 访问量:61

问:

假设数据是 -

"King Khaled Hospital """"NG"""""

长度(包括引号和空格)= 33

在上面的例子中:

  1. 保持起始和结束引号不变,均表示位置 1 和位置 33
  2. 在 NG 之前,有 4 个双引号。所以让它们只有 1。
  3. NG之后,在29、30、31、32、33的位置有5个双引号。 第 33 个双引号应保留,因为它是结束的。29、30、31、32 应转换为 1 个双引号。

最终输出:

"King Khaled Hospital "NG""

长度 = 27

这只是一个例证。数据可以是任何东西。

让我举一个帖子的例子:

我的df:

>>>
>>> df.select('full_nm').where(df['eid'] == '60806998').show(truncate=False)
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|full_nm                                                                                                  |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""King Khaled Hospital """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""NG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

最终输出:

"King Khaled Hospital "NG""

如果我使用以下代码:

>>> df_temp = df.withColumn('full_nm', regexp_replace('full_nm', r'("{2,})([^"]+)\1', r'"$2"'))
>>> df_temp.select('full_nm').where(df_temp['eid'] == '60806998').show(truncate=False)
23/11/13 08:58:51 WARN Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|full_nm                                  |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|"King Khaled Hospital ""NG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
数据帧 pyspark regexp-replace apache-spark-dataset

评论

0赞 user238607 11/11/2023
您可以使用子字符串函数,然后对于内部引号,可以使用字符串替换。sparkbyexamples.com/pyspark/pyspark-substring-from-a-column

答:

1赞 Shubham Sharma 11/11/2023 #1

设置

df.show()

+---------------------------------+
|col                              |
+---------------------------------+
|"King Khaled Hospital """"NG"""""|
|foo ""baz""                      |
|"foo bar"                        |
|"foo """bar""" ""baz"""          |
|"""foo"""                        |
+---------------------------------+

让我们使用 regexp_replace 将两个或多个连续出现的引号替换为单个引号。请记住,在这里,我假设数据集中的字符串始终由相同数量的引号四舍五入,例如,如果一个单词前面有 4 个引号,那么它后面必须有 4 个引号

result = df.withColumn('clean_col', F.regexp_replace('col', r'("{2,})([^"]+)\1', r'"$2"'))

结果

+---------------------------------+---------------------------+
|col                              |clean_col                  |
+---------------------------------+---------------------------+
|"King Khaled Hospital """"NG"""""|"King Khaled Hospital "NG""|
|foo ""baz""                      |foo "baz"                  |
|"foo bar"                        |"foo bar"                  |
|"foo """bar""" ""baz"""          |"foo "bar" "baz""          |
|"""foo"""                        |"foo"                      |
+---------------------------------+---------------------------+

评论

0赞 alka 11/13/2023
嗨,我在问题中添加了几行。请看一下,感谢您的回复。
0赞 alka 11/13/2023
引号可以是任何数字。
0赞 alka 11/14/2023
嗨,请问我有什么回应吗?
0赞 alka 11/14/2023
左边和右边的报价数量也可以变化
0赞 Shubham Sharma 11/14/2023
Lemme在某个时候研究一下。