Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 获取Spark DataFrame SQL中没有路径的文件名_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Apache spark 获取Spark DataFrame SQL中没有路径的文件名

Apache spark 获取Spark DataFrame SQL中没有路径的文件名,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我有一个Spark Dataframe,它包含通过Spark XML解析的XML文件夹中的数据。我想添加一个包含源文件的列,这可以通过input_file_name()函数轻松完成 问题是,这将返回整个路径,而我只需要文件名。因此,我尝试在spark SQL中注册一个UDF,该UDF提取文件名,但最终得到一个空列。这个函数可以工作,但显然它会得到空值作为输入,我不明白为什么 有人知道这个问题以及如何解决它吗 编辑:示例 如果我通过df.selectExpr('input\u file\u nam

我有一个Spark Dataframe,它包含通过Spark XML解析的XML文件夹中的数据。我想添加一个包含源文件的列,这可以通过input_file_name()函数轻松完成

问题是,这将返回整个路径,而我只需要文件名。因此,我尝试在spark SQL中注册一个UDF,该UDF提取文件名,但最终得到一个空列。这个函数可以工作,但显然它会得到空值作为输入,我不明白为什么

有人知道这个问题以及如何解决它吗

编辑:示例

如果我通过
df.selectExpr('input\u file\u name()')
选择文件名列,那么我将获得路径和文件名。但是,如果我定义了一个函数,只返回输入:

def f(path):
    return path

然后通过
session.udf.register('f',f)
,再通过
df.selectExpr('f(input_file_name()))
,我得到一个空列。

我们可以注册一个
udf
,它将只返回最后一个
“/”后面的字符串部分,并将此函数应用于
input\u file\u name()
的输出:


你能提供可复制的代码来说明你的问题吗?增加了一个例子。谢谢。@stackoverflowthebest:您是否尝试了
df.select()
而不是
df.selectExpr()
?它根本不起作用,甚至不直接调用
df.select('input\u file\u name()')
。我需要将函数注册为sql函数,而不是外部注册。如果我调用例如
df.selectExpr('f(anyothercolumn)
,它通常与数据帧中的其他列一起工作。正如我前面所写的,我需要将该函数注册为SQL函数,以便我可以在查询内部调用它,而不是像您的示例那样在外部调用它。它应该可以工作,因为所有其他功能都可以工作,对于其他列,这是唯一一个不工作的。是的,它可以,但我已经有了这个功能。问题是它返回一个空列。不管您如何定义函数,因为输入(在您的示例中是x)在进入函数时已经是空的,我不明白为什么,因为如果我使用另一列而不是input_file_name(),它会工作。真的吗?真奇怪。您是否也使用spark xml读取xml文件?我不知道问题出在哪里。我用spark xml加载数据。奇怪的是,filename列正在工作,但没有传递到udf。
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')