【问题标题】:Pyspark dataframe change format if regex applies如果正则表达式适用,则 Pyspark 数据框更改格式
【发布时间】:2022-01-25 20:09:29
【问题描述】:

我目前正在转换数据框中的一些日期数据,如下所示:

+-----------+------------+
|first_col|sec_col-------|
+---------+--------------+
|a--------|28-04-2021    |
|a--------|01-03-2017    |
|a--------|"Feb 23, 2012"|
|a--------|"May 01, 2019"|
+---------+--------------+

我现在想将最后两行转换为更好的日期格式,如下所示:23-Feb-2012 我想用正则表达式来做这个,但是下面的代码不起作用:

from pyspark.sql import functions as f
from pyspark.sql.functions import regexp_replace, regexp_extract

#(a lot of stuff happens here which is not important for the question so I let it out)

input_df = input_df.withColumn("sec_col", input_df.sec_col.cast("String"))
    .withColumn("sec_col2", 
        f.when(input_df.sec_col.rlike("\"\w{3} \d{2}, \d{4}\""),
            f.concat(regexp_extract("sec_col","\"(\w{3}) (\d{2}), (\d{4})\"",2),f.lit("-"), regexp_extract("sec_col","\"(\w{3}) (\d{2}), (\d{4})\"",1),f.lit("-"),regexp_extract("sec_col","\"(\w{3}) (\d{2}), (\d{4})\"",3))))
         .otherwise(f.col("sec_col"))

谁能帮忙?

【问题讨论】:

    标签: python regex pyspark


    【解决方案1】:

    您可以使用to_date 直接将其转换为日期,而不是尝试使用regex 解析数据格式,因为您已经知道date_format 来解析和获取第一个非空值

    数据准备

    sparkDF = sql.createDataFrame([("28-04-2021",),
                                   ("01-03-2017",),
                                   ("Feb 23, 2012",),
                                   ("May 01, 2019",)
                                  ]
                                  ,['timestamp'])
    
    sparkDF.show()
    
    +------------+
    |   timestamp|
    +------------+
    |  28-04-2021|
    |  01-03-2017|
    |Feb 23, 2012|
    |May 01, 2019|
    +------------+
    
    

    解析日期

    
    sparkDF = sparkDF.withColumn('p1',F.to_date(F.col('timestamp'),"MMM dd, yyyy"))\
                     .withColumn('p2',F.to_date(F.col('timestamp'),"dd-MM-yyyy"))
    
    
    +------------+----------+----------+
    |   timestamp|        p1|        p2|
    +------------+----------+----------+
    |  28-04-2021|      null|2021-04-28|
    |  01-03-2017|      null|2017-03-01|
    |Feb 23, 2012|2012-02-23|      null|
    |May 01, 2019|2019-05-01|      null|
    +------------+----------+----------+
    

    合并

    sparkDF = sparkDF.withColumn('timestamp_parsed',F.coalesce(F.col('p1'),F.col('p2')))\
                     .drop(*['p1','p2'])
    
    sparkDF.show()
    
    +------------+----------------+
    |   timestamp|timestamp_parsed|
    +------------+----------------+
    |  28-04-2021|      2021-04-28|
    |  01-03-2017|      2017-03-01|
    |Feb 23, 2012|      2012-02-23|
    |May 01, 2019|      2019-05-01|
    +------------+----------------+
    

    此外,您可以查看各种可用的解析格式here,类似的问题可以在here找到

    【讨论】:

    • 用缺少的代码 sn-p 更新了答案
    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2021-09-27
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多