如何从PySpark读取过程中提取路径中的日期参数?
如何从PySpark读取的S3分文件夹数据中提取日期信息
当你通过PySpark读取S3上按YYYY-MM-DD日期分文件夹存储的CSV数据时,日期信息仅存在于文件夹路径中,并未包含在数据本身。以下是两种可靠的提取方法:
方法一:使用正则表达式匹配日期
利用PySpark的input_file_name()函数获取每条数据所属的完整文件路径,再通过正则表达式提取路径中的日期字符串:
from pyspark.sql.functions import input_file_name, regexp_extract # 读取所有日期文件夹下的CSV数据 df = spark.read.format('csv').option('header', 'true').load('s3://my_root/my_datasource') # 从文件路径中提取YYYY-MM-DD格式的日期 df_with_date = df.withColumn( 'date', regexp_extract(input_file_name(), r'(\d{4}-\d{2}-\d{2})', 1) ) # 可选:将字符串类型的日期转为Date类型,方便后续日期相关操作 df_with_date = df_with_date.withColumn('date', df_with_date['date'].cast('date'))
这种方法适配性强,即使路径结构有微小变化,只要日期格式是YYYY-MM-DD就能准确提取。
方法二:基于固定路径结构分割提取
如果你的文件夹路径结构固定(例如始终是s3://my_root/my_datasource/YYYY-MM-DD/文件名.csv),可以通过分割路径字符串直接获取日期文件夹名称:
from pyspark.sql.functions import input_file_name, split, element_at # 读取数据 df = spark.read.format('csv').option('header', 'true').load('s3://my_root/my_datasource') # 按路径分隔符/拆分,取倒数第二个元素(即日期文件夹) df_with_date = df.withColumn( 'date', element_at(split(input_file_name(), '/'), -2) ) # 可选:转为Date类型 df_with_date = df_with_date.withColumn('date', df_with_date['date'].cast('date'))
这种方法无需正则匹配,执行效率更高,但依赖固定的路径层级结构。
内容的提问来源于stack exchange,提问作者Randomize
相关产品推荐
相关产品推荐

