如何在PySpark中转换特殊格式日期字符串为YYYY-MM-DD(Glue Job场景)
在PySpark DataFrame中转换特殊格式日期为YYYY-MM-DD(Glue Job场景)
针对你遇到的「May the 9th of 2022」这类带后缀的特殊日期格式,需要分两步处理:先清理日期后缀,再解析为标准日期格式,具体实现如下:
核心步骤
- 清理日期后缀:用正则表达式移除日期数字后的
st|nd|rd|th后缀,将9th转为9、09th转为09。 - 解析为标准日期类型:使用PySpark的
to_date函数,指定清理后的日期格式MMMM the dd of yyyy(MMMM匹配英文月份全称)。 - 输出YYYY-MM-DD格式:若需字符串格式,用
date_format转换;日期类型直接写入Redshift会自动适配其DATE类型的存储格式。
完整代码示例
导入必要函数
from pyspark.sql.functions import regexp_replace, to_date, date_format
读取CSV数据(Glue Job场景)
# 从S3读取CSV,假设日期列名为"special_date" df = spark.read.csv("s3://your-bucket/path/to/your-data.csv", header=True, inferSchema=False)
处理日期列
# 第一步:移除日期后缀 df = df.withColumn("cleaned_date", regexp_replace("special_date", r"(\d+)(st|nd|rd|th)", r"\1")) # 第二步:解析为日期类型 df = df.withColumn("standard_date", to_date("cleaned_date", "MMMM the dd of yyyy")) # 可选:转为YYYY-MM-DD格式的字符串 df = df.withColumn("formatted_date", date_format("standard_date", "yyyy-MM-dd"))
验证结果
df.select("special_date", "standard_date", "formatted_date").show(truncate=False)
写入Redshift
df.write \ .format("jdbc") \ .option("url", "jdbc:redshift://your-redshift-endpoint:5439/your-db-name") \ .option("dbtable", "target_schema.target_table") \ .option("user", "your-username") \ .option("password", "your-password") \ .mode("append") \ .save()
注意事项
- 确保使用的PySpark/Glue版本支持正则替换和指定格式的日期解析(Glue 2.0及以上版本均支持)。
- 若遇到月份缩写(如
Jun),需将格式字符串中的MMMM改为MMM。 - 日期类型的
standard_date写入Redshift时,会自动以YYYY-MM-DD格式存储,无需额外转换。
内容的提问来源于stack exchange,提问作者Jigar
相关产品推荐
相关产品推荐

