2016-11-10 13 views
2

私はspark-dataを解析したXMLフォルダからspark-xmlまでのデータを持っています。 input_file_name()関数で簡単に実行できるソースファイルを含む列を追加したいと思います。Spark DataFrameでパスなしのファイル名を取得するSQL

問題は、これはパス全体を返し、ファイル名のみを必要とすることです。だから、ファイル名を抽出するspark SQLにUDFを登録しようとしましたが、最後に空の列があります。この関数は機能しますが、明らかに入力として空の値が得られますが、私はその理由を理解していません。

誰もがこの問題を知っていて、それを解決する方法はありますか?

EDIT:例

私はdf.selectExpr('input_file_name()')を通じて、ファイル名の列を選択した場合は、その後、私はパスとファイル名を取得します。私はしかし、単に入力を返す関数を定義する場合:

def f(path): 
    return path 

をしてsession.udf.register('f',f)を通してそれを登録し、そしてdf.selectExpr('f(input_file_name())')を通じて再び列を選択し、私は空の列を取得します。

+0

あなたの質問を説明するために再現性のあるコードを提供してくださいできますか? – mtoto

+0

が追加されました。ありがとう。 – stackoverflowthebest

+0

@stackoverflowthebest: 'df.selectExpr()'の代わりに 'df.select()'を試しましたか? – Shankar

答えて

0

我々は最後の"/"後の文字列の一部だけを返し、input_file_name()の出力にこの機能を適用する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') 
+0

前に書いたように、関数をSQL関数として登録する必要があります。そのため、例のように外部ではなくクエリ内で呼び出すことができます。他のすべての関数が動作するので、他の列と一緒に動作するはずです。これは動作しない唯一の関数です。 – stackoverflowthebest

+0

答えが更新されました、これはあなたが探しているものですか? – mtoto

+0

はい、そうですが、私はすでにその機能を持っています。問題は、空の列を返すことです。 input_file_name()の代わりに別の列を使用すると、関数をどのように定義するかは関係ありません。なぜなら、入力(例ではx)が関数に入るときにすでに空であり、働く – stackoverflowthebest

関連する問題