在 PySpark 中,使用 regexp_replace,如何用另一列的值替换组?

pal*_*upz 2 python apache-spark apache-spark-sql pyspark pyspark-dataframes

我有一个包含两列的数据框:filenameyear。我想filenameyear列中的值替换年份值

下表中的第三列显示了要求:

+----------------------------+------+----------------------------+
| filename                   | year | reqd_filename              |
+----------------------------+------+----------------------------+
| blah_2020_v1_blah_blah.csv | 1975 | blah_1975_v1_blah_blah.csv |
+----------------------------+------+----------------------------+
| blah_2019_v1_blah_blah.csv | 1984 | blah_1984_v1_blah_blah.csv |
+----------------------------+------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

代码目前如下所示:

df = df.withColumn('filename', F.regexp_replace(F.col('filename',), '(blah_)(.*)(_v1.*)', <Nothing I put here works>))
Run Code Online (Sandbox Code Playgroud)

简而言之,我想用yeardf 中的列替换第二组

Sur*_*ali 5

您可以使用expr执行此操作。
我使用([0-9]{4})正则表达式模式来检测filename.

from pyspark.sql.functions import expr

df.withColumn("reqd_filename",expr("regexp_replace(filename, \
        '([0-9]{4})', year)")).show()

+--------------------------+----+--------------------------+                    
|filename                  |year|reqd_filename             |
+--------------------------+----+--------------------------+
|blah_2020_v1_blah_blah.csv|1975|blah_1975_v1_blah_blah.csv|
|blah_2019_v1_blah_blah.csv|1984|blah_1984_v1_blah_blah.csv|
+--------------------------+----+--------------------------+
Run Code Online (Sandbox Code Playgroud)