web-dev-qa-db-fra.com

Impossible de trouver la fonction col dans pyspark

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?

23
Bamqf

Ç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.

29
user6910411

À 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

3
Dmytro Balych

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.

Forced builtins

0
AEDWIP