如何解决将文件名称拆分为pyspark数据框的不同列
我正在使用pyspark SQL函数input_file_name将输入文件名添加为数据框列。
User X
该列现在具有如下值。 “ abc:// dev / folder1 / date = 20200813 / id = 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 |
+-------------------------------------+--------+---+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。