2016-11-10 51 views
2

我有一个Spark Dataframe,它具有通过spark-xml解析的XML文件夹中的数据。我想添加一个包含源文件的列,这很容易通过input_file_name()函数完成。在Spark DataFrame中获取没有路径的文件名SQL

问题是这会返回整个路径,而我只想要文件名。所以我尝试在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())')再次选择的专栏中,我得到一个空列。

+0

能否请您提供可重复的代码来说明你的问题? – mtoto

+0

增加了一个例子。谢谢。 – stackoverflowthebest

+0

@stackoverflowthebest:你试过'df.select()'而不是'df.selectExpr()'吗? – Shankar

回答

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') 
+0

正如我前面写的,我需要将该函数注册为SQL函数,以便我可以在查询中调用它,而不是作为示例在外部调用它。它应该可以工作,因为所有其他功能都可以工作,而在其他专栏中,这是唯一不起作用的功能。 – stackoverflowthebest

+0

答案更新了,这是你在找什么? – mtoto

+0

是的,但是我已经有了这个功能。问题是它返回一个空列。无论您如何定义函数,因为输入(您的示例中的x)在进入函数时已经是空的,我不明白为什么,因为如果我使用另一列而不是input_file_name(),它作品。 – stackoverflowthebest

相关问题