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

Posted

技术标签:

【中文标题】修改字符串列并替换子字符串 pyspark【英文标题】:modify a string column and replace substring pypsark 【发布时间】:2021-12-13 03:18:55 【问题描述】:

我有一个 pyspark 数据框,其名称列的示例值如下:

 id   NAME
 ---+-------
  1  aaa bb c
  2  xx yy z
  3  abc def 
  4  qw er
  5  jon lee ls G

我必须翻转最右边的部分并在左侧用逗号填充它并删除最右边的子字符串(使用空格分割)

预期输出

id   NAME
---+-------
 1   c, aaa bb
 2   z, xx yy
 3   def, abc
 4   er, qw
 5   G, jon lee ls 

通过使用以下代码,我能够得到最正确的部分以用逗号添加它: split_col=split(df['NAME'],'') df2 = df2.withColumn('NAME_RIGHT',split_col.getItem(F.size(split_col) - 1))

上面的行给出了

NAME_RIGHT
  c
  z
  def 
  er

我想替换 NAME_RIGHT 中的值,即 NAME 列中最右边的值,我尝试使用下面的代码,但它什么也没替换,如何实现?

df3 = df2.withColumn('NEW_NAME', regexp_replace(F.col("NAME"), str(df2.NAME_RIGHT),""))

【问题讨论】:

【参考方案1】:

Regex 会有点麻烦,我建议改用splitconcat

from pyspark.sql import functions as F

(df
    .withColumn('n1', F.split('name', ' '))
    .withColumn('n2', F.reverse('n1')[0])
    .withColumn('n3', F.concat_ws(' ', F.array_except('n1', F.array('n2'))))
    .withColumn('n4', F.concat_ws(', ', F.array('n2', 'n3')))
    .show()
)

# +---+------------+-----------------+---+----------+-------------+
# | id|        name|               n1| n2|        n3|           n4|
# +---+------------+-----------------+---+----------+-------------+
# |  1|    aaa bb c|     [aaa, bb, c]|  c|    aaa bb|    c, aaa bb|
# |  2|     xx yy z|      [xx, yy, z]|  z|     xx yy|     z, xx yy|
# |  3|    abc def |     [abc, def, ]|   |   abc def|    , abc def|
# |  4|       qw er|         [qw, er]| er|        qw|       er, qw|
# |  5|jon lee ls G|[jon, lee, ls, G]|  G|jon lee ls|G, jon lee ls|
# +---+------------+-----------------+---+----------+-------------+

【讨论】:

以上是关于修改字符串列并替换子字符串 pyspark的主要内容,如果未能解决你的问题,请参考以下文章

在 Pyspark 中屏蔽/替换字符串列的内部

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

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

如何解析 pyspark 的 DataStreamReader 中的 json 字符串列并创建数据框

解析pyspark中数组的每个元素并应用子字符串

从 pandas DataFrame 中的多个字符串列中删除子字符串