【问题标题】:Get filename without path in Spark DataFrame SQL在 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())')选择列,我得到一个空列。

【问题讨论】:

  • 您能否提供可重现的代码来说明您的问题?
  • 添加了一个例子。谢谢。
  • @stackoverflowthebest:你试过df.select()而不是df.selectExpr()吗?
  • 它根本不起作用,甚至不能直接调用df.select('input_file_name()')。我需要将该函数注册为 sql 函数,而不是外部注册。如果我打电话给例如df.selectExpr('f(anyothercolumn)') 它与数据框中的其他列正常工作。

标签: apache-spark apache-spark-sql spark-dataframe


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2011-04-19
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
相关资源
最近更新 更多