我有一个Spark Dataframe,其中包含通过Spark - XML解析的XML文件夹中的数据。我想添加一个包含源文件的列,这很容易通过input_file_name()函数完成。
问题是这返回整个路径,而我只想要文件名。所以我尝试在spark SQL中注册一个UDF,它提取文件名,但最后我得到一个空列。该函数工作,但显然它得到空值作为输入,我不明白为什么。
有人知道这个问题和如何解决它吗?
编辑:例子
如果我通过df.selectExpr('input_file_name()')
选择filename列,那么我将获得路径和文件名。但是,如果我定义一个函数,只返回输入:
def f(path):
return path
并通过session.udf.register('f',f)
注册,再通过df.selectExpr('f(input_file_name())')
选择该列,得到空列
我们可以注册一个udf
,它将只返回最后一个"/"
之后的部分字符串,并将此函数应用于input_file_name()
的输出:
from pyspark.sql.functions import input_file_name
spark.udf.register("filename", lambda x: x.rsplit('/', 1)[-1])
df.selectExpr('filename(input_file_name()) as file')