【问题标题】:Pyspark: Regex_replace commas between quotesPyspark:Regex_replace 引号之间的逗号
【发布时间】:2022-01-26 21:23:10
【问题描述】:

我正在努力在 Pyspark 中替换为 regexp_replace。我必须关注字符串列:

"1233455666, 'ThisIsMyAdress, 1234AB', 24234234234"

更好地了解字符串:

Id Address Code
1233455666 'ThisIsMyAdress, 1234AB' 24234234234

我接收和处理的总字符串是用逗号分隔的,就像开头的例子一样。不幸的是,我无法更改这种交付数据的格式。为了很好地处理数据,我想将引号之间的逗号替换为空。

唯一的要求是使用regexp_replace

我已经尝试了下面的代码,还有更多。但是使用这些代码,逗号分隔也会中断。那么这个字符串就是一个去掉逗号的大字符串。

.withColumn("ColCommasRemoved" , regexp_replace( col("X"), "[,]", ""))

这给了我这个输出:

"1233455666 'ThisIsMyAdress 1234AB' 24234234234"

我想要实现的输出:

"1233455666, 'ThisIsMyAdress 1234AB', 24234234234"

【问题讨论】:

  • 如果没有 UDF,将很难避免使用 regexp_replace( col("X"), "('[^',]*),([^']*')", "$1$2" ) 时会遇到的多种边缘情况
  • 逗号在逗号分隔的文件中完全有效,只要它们被引用。为什么需要这样做?
  • 在后面的步骤中,我们根据逗号拆分为数据框的列。当@TimRoberts 中有那个逗号时,这个过程现在中断了。是的,也许解决方案的设计并不完美,但它是一种遗留脚本。
  • 使用标准机制解析这些行不是更好吗?
  • 我的主要目标是替换引号内的逗号。在当前解决方案中尝试了您的解决方案,不幸的是@blackbishop

标签: python regex apache-spark pyspark apache-spark-sql


【解决方案1】:

使用regexp_replace

from pyspark.sql import functions as F

df = spark.createDataFrame([("1233455666, 'ThisIsMyAdress, 1234AB', 24234234234",)], ["X"])

result = df.withColumn(
    "ColCommasRemoved",
    F.split(F.regexp_replace("X", ",(?=[^']*'[^']*(?:'[^']*'[^']*)*$)", ""), ",")
).select(
    F.col("ColCommasRemoved")[0].alias("ID"),
    F.col("ColCommasRemoved")[1].alias("Address"),
    F.col("ColCommasRemoved")[2].alias("Code")
)

result.show()
#+----------+------------------------+------------+
#|ID        |Address                 |Code        |
#+----------+------------------------+------------+
#|1233455666| 'ThisIsMyAdress 1234AB'| 24234234234|
#+----------+------------------------+------------+

或者,如果您想直接用, 拆分原始列并忽略引号内的那些:

result = df.withColumn(
    "split",
    F.split(F.col("X"), ",(?=(?:[^']*'[^']*')*[^']*$)")
)

result.show(truncate=False)
#+-------------------------------------------------+-----------------------------------------------------+
#|X                                                |split                                                |
#+-------------------------------------------------+-----------------------------------------------------+
#|1233455666, 'ThisIsMyAdress, 1234AB', 24234234234|[1233455666,  'ThisIsMyAdress, 1234AB',  24234234234]|
#+-------------------------------------------------+-----------------------------------------------------+

【讨论】:

  • 此解决方案在 100 次中的 99 倍中有效,但是当地址具有例如撇号 12345566,'ABC 't ThisIsMyAdress', 24234234234 时,正则表达式由于地址名称中 T 之前的单引号而停止工作。如果我在前一步替换单引号,那么这个逻辑就会中断。我试过这个逻辑: .withColumn("ColReplaceSingleQuote" , F.regexp_replace( col("value"), "[\']", '"' )) .withColumn("ColCommasRemoved", F.regexp_replace(" ColReplaceSingleQuote", ",(?=[^']*'[^']*(?:'[^']*'[^']*)*$)", ""))在建议的解决方案中应用这个?
  • @haassiej 您可以尝试在前面的步骤中使用此F.regexp_replace("X", "(?<!,)(?<!')'(?=.*')", "") 替换它们
猜你喜欢
  • 2018-05-30
  • 2014-10-31
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多