在 Spark DataFrame SQL 中获取没有路径的文件名
Posted
技术标签:
【中文标题】在 Spark DataFrame SQL 中获取没有路径的文件名【英文标题】:Get filename without path in Spark DataFrame SQL 【发布时间】:2016-11-10 10:21:46 【问题描述】:我有一个 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())')
选择列,我得到一个空列。
【问题讨论】:
您能否提供可重现的代码来说明您的问题? 添加了一个例子。谢谢。 @***thebest:你试过df.select()
而不是df.selectExpr()
吗?
它根本不起作用,甚至不能直接调用df.select('input_file_name()')
。我需要将该函数注册为 sql 函数,而不是外部注册。如果我打电话给例如df.selectExpr('f(anyothercolumn)')
它与数据框中的其他列正常工作。
【参考方案1】:
我们可以注册一个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')
【讨论】:
正如我之前写的,我需要将该函数注册为 SQL 函数,以便我可以在查询中调用它,而不是在外部作为您的示例。它应该可以工作,因为所有其他功能都可以工作,其他列,这是唯一不工作的。 是的,但是我已经有了这个功能。问题是它返回一个空列。不管你如何定义函数,因为输入(你的例子中的x)在进入函数时已经是空的,我不明白为什么,因为如果我使用另一列而不是input_file_name(),它工作。 真的吗?这很奇怪。您是否还使用 spark-xml 来读取 XML 文件?我不知道问题出在哪里。 我用 spark-xml 加载数据。奇怪的是文件名列正在工作,但没有传递给 udf。以上是关于在 Spark DataFrame SQL 中获取没有路径的文件名的主要内容,如果未能解决你的问题,请参考以下文章
Spark3.3.0的DataFrame及Spark SQL编程的性能对比单机模式下
Spark3.3.0的DataFrame及Spark SQL编程的性能对比单机模式下
Spark3.3.0的DataFrame及Spark SQL编程的性能对比单机模式下
哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器