Apache spark 使用文件名创建变量-PySpark

Apache spark 使用文件名创建变量-PySpark,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有一个文件夹,文件会在其中被删除(每天、每周),我需要将年和周/日作为变量添加到数据框中,它们以一致的格式存在于文件名中。前缀可以更改(例如,sales\u report,cash\u flow,等等),但最后的字符总是yyy\u WW.csv 例如,对于每周文件,我可以手动为每个文件执行以下操作: from pyspark.sql.functions import lit df = spark.read.load('my_folder/sales_report_2019_12.csv',

我有一个文件夹,文件会在其中被删除(每天、每周),我需要将年和周/日作为变量添加到数据框中,它们以一致的格式存在于文件名中。前缀可以更改(例如,
sales\u report
cash\u flow
,等等),但最后的字符总是
yyy\u WW.csv

例如,对于每周文件,我可以手动为每个文件执行以下操作:

from pyspark.sql.functions import lit

df = spark.read.load('my_folder/sales_report_2019_12.csv', format="csv").withColumn("sales_year", lit(2019)).withColumn("sales_week", lit(12))

我想使用一个从文件名右侧开始计数的子字符串函数来解析
12
2019
。如果我能够解析这些变量的文件名,那么我就可以使用通配符(如
df=spark.read.load('my_folder/sales_report.*.csv',format=“csv”)
读入文件夹中的所有文件,这将大大简化我的代码

您可以尝试以下方法:

import glob
listfiles = glob.glob('my_folder/sales_report_*.csv')
for files in listfiles:
    weekyear = c.split('_',2)[-1].split('_')
    week = weekyear[1]
    year = weekyear[0]
    df = spark.read.load('files', format="csv").withColumn("sales_year", lit(year)).withColumn("sales_week", lit(week))

您可以尝试以下方法:

import glob
listfiles = glob.glob('my_folder/sales_report_*.csv')
for files in listfiles:
    weekyear = c.split('_',2)[-1].split('_')
    week = weekyear[1]
    year = weekyear[0]
    df = spark.read.load('files', format="csv").withColumn("sales_year", lit(year)).withColumn("sales_week", lit(week))

您可以使用
input\u file\u name()
列和一些字符串函数(如
regexp\u extract
substring\u index)轻松地从文件名中提取它:

df = spark.read.load('my_folder/*.csv', format="csv")

df = df.withColumn("year_week", regexp_extract(input_file_name(), "\d{4}_\d{1,2}"))\
       .withColumn("sales_year", substring_index(col("year_week"), "_", 1))\
       .withColumn("sales_week", substring_index(col("year_week"), "_", -1))\
       .drop("year_week")

您可以使用
input\u file\u name()
列和一些字符串函数(如
regexp\u extract
substring\u index)轻松地从文件名中提取它:

df = spark.read.load('my_folder/*.csv', format="csv")

df = df.withColumn("year_week", regexp_extract(input_file_name(), "\d{4}_\d{1,2}"))\
       .withColumn("sales_year", substring_index(col("year_week"), "_", 1))\
       .withColumn("sales_week", substring_index(col("year_week"), "_", -1))\
       .drop("year_week")