将文件名拆分为 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 个不同的列。
- 日期
- 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 |
+-------------------------------------+--------+---+
我正在使用 pyspark SQL 函数 input_file_name 将输入文件名添加为数据框列。
df = df.withColumn("filename",input_file_name())
该列现在具有如下值。 "abc://dev/folder1/date=20200813/id=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 |
+-------------------------------------+--------+---+