将文件名拆分为 pyspark 数据框的不同列

Split file name into different columns of pyspark dataframe

我正在使用 pyspark SQL 函数 input_file_name 将输入文件名添加为数据框列。

df = df.withColumn("filename",input_file_name())

该列现在具有如下值。 "abc://dev/folder1/date=20200813/id=1"

根据上面的列,我必须创建 2 个不同的列。

  1. 日期
  2. ID

我只需要从上面的文件名中获取日期和 ID,并将其填充到上面提到的列中。

我可以用 split_col 得到它。但是,如果文件夹结构发生变化,则可能会出现问题。

有没有办法检查文件名中是否包含字符串“date”和“id”,并获取等号后的值并将其填充到两个新列中?

下面是预期的输出。

filename                             date     id
abc://dev/folder1/date=20200813/id=1 20200813 1

您可以将 regexp_extract 与查看 date=id= 子字符串的模式一起使用:

df = sc.parallelize(['abc://dev/folder1/date=20200813/id=1', 
                     'def://dev/folder25/id=3/date=20200814'])\
       .map(lambda l: Row(file=l)).toDF()
+-------------------------------------+
|file                                 |
+-------------------------------------+
|abc://dev/folder1/date=20200813/id=1 |
|def://dev/folder25/id=3/date=20200814|
+-------------------------------------+
df = df.withColumn('date', f.regexp_extract(f.col('file'), '(?<=date=)[0-9]+', 0))\
       .withColumn('id', f.regexp_extract(f.col('file'), '(?<=id=)[0-9]+', 0))
df.show(truncate=False)

输出:

+-------------------------------------+--------+---+
|file                                 |date    |id |
+-------------------------------------+--------+---+
|abc://dev/folder1/date=20200813/id=1 |20200813|1  |
|def://dev/folder25/id=3/date=20200814|20200814|3  |
+-------------------------------------+--------+---+