将文件名拆分为pysparkDataframe的不同列

aemubtdh  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(399)

我使用pysparksql函数input\ file\ name将输入文件名添加为dataframe列。

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

该列现在具有如下值。“://dev/folder1/date=20200813/id=1"
从上面的列中,我必须创建两个不同的列。
日期
身份证件
我只需要从上面的文件名中获取日期和id,并将其填充到上面提到的列中。
我可以用split\u col得到它。但如果文件夹结构发生变化,则可能是个问题。
有没有办法检查文件名中是否包含字符串“date”和“id”,并获取等于符号后的值并填充两个新列?
下面是预期输出。

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

mzsu5hc01#

你可以用 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  |
+-------------------------------------+--------+---+

相关问题