Dans pyspark 1.6.2, je peux importer la fonction col
en
from pyspark.sql.functions import col
mais quand j'essaie de le rechercher dans le code source Github , je ne trouve aucune fonction col
dans le fichier functions.py
, comment python peut-il importer une fonction qui n'existe pas?
Ça existe. Ce n'est simplement pas explicitement défini. Les fonctions exportées à partir de pyspark.sql.functions
sont des enveloppes minces autour du code JVM et, à quelques exceptions près nécessitant un traitement spécial, sont générées automatiquement à l'aide de méthodes d'assistance.
Si vous vérifiez soigneusement la source vous trouverez col
parmi d'autres _functions
. Ce dictionnaire est plus réitéré et _create_function
est utilisé pour générer des wrappers. Chaque fonction générée est directement assignée à un nom correspondant dans globals
.
Enfin, __all__
, qui définit une liste d’articles exportés du module, n’exporte que tous les globals
, à l’exclusion de ceux contenus dans la liste noire.
Si ce mécanisme n'est toujours pas clair, vous pouvez créer un exemple de jouet:
Créez un module Python appelé foo.py
avec le contenu suivant:
# 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")]
Placez-le quelque part sur le chemin Python (par exemple, dans le répertoire de travail).
Importer foo
:
from foo import foo
foo(1)
Un effet secondaire indésirable de cette approche de métaprogrammation est que les fonctions définies peuvent ne pas être reconnues par les outils uniquement en fonction d’une analyse de code statique. Ce n'est pas un problème critique et peut être ignoré en toute sécurité pendant le processus de développement.
Selon IDE installer annotations de type pourrait résoudre le problème.
À partir de VS Code 1.26.1, ceci peut être résolu en modifiant le paramètre python.linting.pylintArgs
:
"python.linting.pylintArgs": [
"--generated-members=pyspark.*",
"--extension-pkg-whitelist=pyspark",
"--ignored-modules=pyspark.sql.functions"
]
Ce problème a été expliqué sur github: https://github.com/DonJayamanne/pythonVSCode/issues/1418#issuecomment-411506443
J'ai rencontré un problème similaire en essayant de configurer un environnement de développement PySpark avec Eclipse et PyDev. PySpark utilise un espace de noms dynamique. Pour que cela fonctionne, j'avais besoin d'ajouter PySpark pour "forcer les Builtins" comme ci-dessous.