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

问题描述

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

User X

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

在上面的列中,我必须创建2个不同的列。

  1. 日期
  2. ID

我只能从上述文件名中获取日期和ID,并将其填充到上述列中。

我可以使用split_col并获取它。但是,如果文件夹结构发生变化,则可能是一个问题。

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

下面是预期的输出。

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

解决方法

您可以将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','(?<=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  |
+-------------------------------------+--------+---+

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...