Pyspark - 用不同的字符替换字符串的一部分(不均匀的字符数)
Pyspark - Replace portion of a string with different characters (uneven character count)
我正在尝试用具有 :
和 +
的不同且较短的字符串替换字符串的一部分。尽管 Start 列下的值是时间,但它不是时间戳,而是被识别为字符串。
我试过使用regexp_replace
但目前不知道如何指定'Start'列中字符串中需要替换的最后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 |
并希望将开始列替换为名为 'Replaced' 的新列或保留 'Start' 列 header。
预期输出:
| 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 |
您可以通过提供输入时间戳模式,使用 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|
+-------------------------+--------------------+
我也能够在不使用 regexp_replace 的情况下解决这个问题,而是使用 expr
和 format_string
,因为输入是字符串而不是时间戳。
df= df.withColumn( "Start", expr("substring(Start, 1, length(Start)-8)") )
df= df.withColumn( "Start", format_string("%s00Z", "Start") )
我正在尝试用具有 :
和 +
的不同且较短的字符串替换字符串的一部分。尽管 Start 列下的值是时间,但它不是时间戳,而是被识别为字符串。
我试过使用regexp_replace
但目前不知道如何指定'Start'列中字符串中需要替换的最后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 |
并希望将开始列替换为名为 'Replaced' 的新列或保留 'Start' 列 header。
预期输出:
| 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 |
您可以通过提供输入时间戳模式,使用 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|
+-------------------------+--------------------+
我也能够在不使用 regexp_replace 的情况下解决这个问题,而是使用 expr
和 format_string
,因为输入是字符串而不是时间戳。
df= df.withColumn( "Start", expr("substring(Start, 1, length(Start)-8)") )
df= df.withColumn( "Start", format_string("%s00Z", "Start") )