2016-11-10 204 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