【问题标题】:Read file names that contain last 21 days读取包含过去 21 天的文件名
【发布时间】:2020-05-18 22:23:13
【问题描述】:

我在 Microsoft Azure 存储资源管理器中有一个 parquet 文件名。

文件名如下所示:

dataset_2019_11_19-19.parquet
dataset_2020_01_19-20.parquet
dataset_2020_01_20-20.parquet
dataset_2020_01_21-20.parquet
dataset_2020_01_22-20.parquet

如果我想读取 2020 年的所有数据,我会这样做,我使用通配符来获取 2020 年之后的任何数据:

datapath_v3_indata_imptp = "wasbs://mydata@mine.blob.core.windows.net/first_folder/dataset_2020*"
df_indata_v3_imptp=spark.read.format("parquet").option("header", "true").load(datapath_v3_indata_imptp)

我如何才能获得最近 21 天的数据?

【问题讨论】:

  • 有三种可能的方法:1)为每个文件名提取日期,并使用datetime模块解析它们,然后检查它们是否大于datetime.datetime.now() - datetime.timedelta(days=21); 2) 生成过去 21 天的日期(也使用datetime 模块),将它们转换为字符串并仅选择包含这些字符串的文件名; 3) 只需创建 21 天前的日期:(datetime.datetime.now() - datetime.timedelta(days=21)).date().isoformat(),然后比较文件名 - 对于 ISO 日期格式,较大的字符串表示较晚的日期。
  • 谢谢!它目前的日期格式不正确,所以我需要修改它。抱歉,我对 Python 很陌生,所以还在学习
  • 您可以使用 (datetime.datetime.now() - datetime.timedelta(days=21)).date().strftime('%Y_%m_%d') 以 YYYY_MM_DD 格式获取日期,就像在您的文件名中一样。
  • 您能否提供一个可重现的解决方案,以便我进行测试?这太棒了,对 Python 来说非常新,甚至不知道在哪里放置你建议的代码。谢谢

标签: python pyspark wildcard databricks


【解决方案1】:

使用 input_file_name() 函数从文件名中提取日期,然后使用 split + regexp_extract(仅获取日期),最后to_dateyyyy-MM-dd 格式创建日期。

  • 要过滤使用date_sub(current_date(),21)函数获取前21天的日期。

Example:

from pyspark.sql.functions import *
#reading directory 
spark.read.parquet("wasbs://mydata@mine.blob.core.windows.net/first_folder/").\
withColumn("date",\
    to_date(\
        regexp_extract(\
            split(input_file_name(),"-")[0]\
            ,"_(.*)",1),\
        "yyyy_MM_dd")).\
filter(col("date") > date_sub(current_date(),21)).\
show(10,False)

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多