Pyspark - 用不同的字符替换字符串的一部分(字符数不均匀)

Posted

技术标签:

【中文标题】Pyspark - 用不同的字符替换字符串的一部分(字符数不均匀)【英文标题】:Pyspark - Replace portion of a string with different characters (uneven character count) 【发布时间】:2021-10-23 11:46:06 【问题描述】:

我正在尝试用具有:+ 的不同且更短的字符串替换字符串的一部分。即使开始列下的值是时间,它也不是时间戳,而是被识别为字符串。

我尝试过使用regexp_replace,但目前不知道如何在“开始”列中指定需要替换的字符串中的最后 8 个字符或指定要替换为新字符串的字符串一个。

df = df.withColumn('replaced', regexp_replace('Start', ':00+10:00', '00Z' ))

例如: 我将从带有列的数据框开始:

| Data | Qualifier | Description | Start                    |
|:----:|:---------:|:-----------:|:------------------------:|
|12    | 54        | apple       |2021-03-03T02:00:00+10:00 |
|24    | 32        | banana      |2021-03-04T22:30:00+10:00 |
|24    | 32        | orange      |2021-03-04T11:58:00+10:00 |

并希望将 Start 列替换为名为“Replaced”的新列或保留“Start”列标题。

预期输出:

| Data | Qualifier | Description | Replaced                 |
|:----:|:---------:|:-----------:|:------------------------:|
|12    | 54        | apple       |2021-03-03T02:00:00Z      |
|24    | 32        | banana      |2021-03-04T22:30:00Z      |
|24    | 32        | orange      |2021-03-04T11:58:00Z      |

【问题讨论】:

【参考方案1】:

您可以通过提供输入时间戳模式,使用to_timestamp() 函数将列类型转换为时间戳。

如果您真的想使用regexp_replace,那么在您的正则表达式模式中,您必须使用\ 转义+

>>> df = spark.createDataFrame(['2021-03-03T02:00:00+10:00'], StringType())
>>> df.withColumn('replaced', regexp_replace("value", "\+\d+:\d+", "Z")).show(truncate=False)

+-------------------------+--------------------+
|value                    |replaced            |
+-------------------------+--------------------+
|2021-03-03T02:00:00+10:00|2021-03-03T02:00:00Z|
+-------------------------+--------------------+

【讨论】:

【参考方案2】:

我也能够在不使用 regexp_replace 而是使用 exprformat_string 的情况下解决此问题,因为输入是字符串而不是时间戳。

df= df.withColumn( "Start", expr("substring(Start, 1, length(Start)-8)") )

df= df.withColumn( "Start", format_string("%s00Z", "Start") )

【讨论】:

以上是关于Pyspark - 用不同的字符替换字符串的一部分(字符数不均匀)的主要内容,如果未能解决你的问题,请参考以下文章

修改字符串列并替换子字符串 pyspark

PySpark:用数值替换字符串

用其他列值pyspark替换包含美元符号($)的子字符串[重复]

Pyspark 数组列 - 用默认值替换空元素

如果字符串包含 PySpark 中的某些子字符串,则替换字符串

使用 PySpark 删除和替换字符