关于python:从Pyspark Dataframe列中提取文件扩展名

Extract file extension from Pyspark Dataframe column

我有一个pyspark数据帧,列FullPath

如何使用函数os.path.splitext(FullPath)提取FullPath列中每个条目的扩展名并将它们放在新列中?

谢谢。


您可以使用pyspark.sql.functions.regexp_extract()提取文件扩展名:

1
2
3
4
5
6
7
8
9
10
11
12
import pyspark.sql.functions as f
data = [
    ('/tmp/filename.tar.gz',)
]

df = sqlCtx.createDataFrame(data, ["FullPath"])
df.withColumn("extension", f.regexp_extract("FullPath","\.[0-9a-z]+$", 0)).show()
#+--------------------+---------+
#|            FullPath|extension|
#+--------------------+---------+
#|/tmp/filename.tar.gz|      .gz|
#+--------------------+---------+

但是,如果您想使用os.path.splittext(),则需要使用udf(这将比上述替代方案慢):

1
2
3
4
5
6
7
8
import os
splittext = f.udf(lambda FullPath: os.path.splitext(FullPath)[-1], StringType())
df.withColumn("extension", splittext("FullPath")).show()
#+--------------------+---------+
#|            FullPath|extension|
#+--------------------+---------+
#|/tmp/filename.tar.gz|      .gz|
#+--------------------+---------+

SQL函数模块有一个split功能,因此您可以在"。"上拆分完整路径。 角色并采取最后一个元素。 假设只有一个"。" 在每个文件路径字符串中。

1
2
3
import pyspark.sql.functions as F
myDataFrame = myDataFrame.withColumn("pathArray", F.split(myDataFrame.FullPath,".")
myDataFrame = myDataFrame.withColumn("FileExtension", myDataFrame.pathArray.getItem(1))