我有一个Spark Dataframe,它通过spark-xml从解析的XML文件夹中获取数据。我想添加一个包含源文件的列,这可以通过input_file_name()函数轻松完成。
问题是这会返回整个路径,我只想要文件名。所以我尝试在spark SQL中注册一个UDF,它提取文件名,但最后得到一个空列。该函数有效,但显然它将空值作为输入,我不明白为什么。
有谁知道这个问题以及如何解决它?
编辑:示例
如果我通过df.selectExpr('input_file_name()')
选择文件名列,那么我会得到路径和文件名。但是,如果我定义一个函数,只需返回输入:
def f(path):
return path
并通过session.udf.register('f',f)
注册,然后通过df.selectExpr('f(input_file_name())')
再次选择该列,我会得到一个空列。
答案 0 :(得分:0)
我们可以注册一个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')