在 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之DataFrame操作大全

哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器

DataFrame编程模型初谈与Spark SQL