【问题标题】:In PySpark, using regexp_replace, how to replace a group with value from another column? [duplicate]在 PySpark 中,使用 regexp_replace,如何用另一列的值替换一个组? [复制]
【发布时间】:2021-02-13 05:36:29
【问题描述】:

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

下表中的第三列展示了需求:

+----------------------------+------+----------------------------+
| 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 |
+----------------------------+------+----------------------------+

代码目前如下所示:

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

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

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql pyspark-dataframes


    【解决方案1】:

    您可以使用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|
    +--------------------------+----+--------------------------+
    

    【讨论】:

    • 这完全是正确的答案。 F.regexp_replace(...) 不允许像 F.expr("regexp_replace(...)") 版本一样使用 Column 作为第三个参数,这真是太可惜了。它只会让一切变得更脏。
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多