web-dev-qa-db-ja.com

pysparkでcol関数が見つかりません

Pyspark 1.6.2では、次の方法でcol関数をインポートできます。

from pyspark.sql.functions import col

しかし、 Githubソースコード で検索しようとすると、functions.pyファイルにcol関数が見つかりません。どのようにpython関数をインポートできますかそれは存在しませんか?

27
Bamqf

それが存在します。明示的に定義されていないだけです。 pyspark.sql.functionsからエクスポートされた関数は、JVMコードの薄いラッパーであり、特別な処理を必要とするいくつかの例外を除き、ヘルパーメソッドを使用して自動的に生成されます。

ソースを注意深くチェックすると colが他の_functionsにリストされているのがわかります 。この辞書は さらに繰り返される であり、 _create_function はラッパーの生成に使用されます。生成された各関数は、globalsの対応する名前に直接割り当てられます。

最後に、モジュールからエクスポートされるアイテムのリストを定義する__all__は、ブラックリストに含まれるものを除くすべてのglobalsをエクスポートします。

それでもこのメカニズムが明確でない場合は、おもちゃの例を作成できます。

  • Python foo.pyというモジュールを次の内容で作成します:

    # Creates a function assigned to the name foo
    globals()["foo"] = lambda x: "foo {0}".format(x)
    
    # Exports all entries from globals which start with foo
    __all__ = [x for x in globals() if x.startswith("foo")]
    
  • Pythonパス上のどこかに(たとえば、作業ディレクトリに)配置します。

  • インポートfoo

    from foo import foo
    
    foo(1)
    

このようなメタプログラミングアプローチの望ましくない副作用は、定義された関数が静的コード分析だけに依存してツールによって認識されない可能性があることです。これは重大な問題ではなく、開発プロセス中に無視しても問題ありません。

IDEインストール タイプアノテーション によっては、問題が解決する場合があります(たとえば zero323/pyspark-stubs#172 を参照)。

33
user6910411

VS Code 1.26.1現在、これはpython.linting.pylintArgs設定:

"python.linting.pylintArgs": [
        "--generated-members=pyspark.*",
        "--extension-pkg-whitelist=pyspark",
        "--ignored-modules=pyspark.sql.functions"
    ]

その問題はgithubで説明されていました: https://github.com/DonJayamanne/pythonVSCode/issues/1418#issuecomment-41150644

7
Dmytro Balych

Pycharmでは、col関数などに「not found」というフラグが付けられます

enter image description here

回避策は、functionsをインポートし、そこからcol関数を呼び出すことです。

例えば:

from pyspark.sql import functions as F
df.select(F.col("my_column"))
0
Vincent Claes

EclipseとPyDevでPySpark開発環境をセットアップしようとすると、同様の問題に遭遇しました。 PySparkは動的な名前空間を使用します。それを機能させるには、以下のようにPySparkを「force Builtins」に追加する必要がありました。

Forced builtins

0
AEDWIP