Pyspark 1.6.2では、次の方法でcol
関数をインポートできます。
from pyspark.sql.functions import col
しかし、 Githubソースコード で検索しようとすると、functions.py
ファイルにcol
関数が見つかりません。どのようにpython関数をインポートできますかそれは存在しませんか?
それが存在します。明示的に定義されていないだけです。 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 を参照)。
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
EclipseとPyDevでPySpark開発環境をセットアップしようとすると、同様の問題に遭遇しました。 PySparkは動的な名前空間を使用します。それを機能させるには、以下のようにPySparkを「force Builtins」に追加する必要がありました。