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

modify a string column and replace substring pypsark

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

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

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

预期输出

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),""))

正则表达式会有点麻烦,我建议改用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|
# +---+------------+-----------------+---+----------+-------------+