Невозможно найти функцию col в pyspark

В pyspark 1.6.2 я могу импортировать функцию col

from pyspark.sql.functions import col

но когда я пытаюсь найти его в исходном коде Github, я не вижу функции col в файле functions.py, как Python может импортировать функцию, которая не существует?

Ответ 1

Это существует. Это просто не определено явно. Функции, экспортируемые из 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).

Ответ 2

Начиная с 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-411506443

Ответ 3

В Pycharm функция col и другие помечены как "не найдены"

enter image description here

Обходной путь - импортировать functions и вызывать функцию col оттуда.

например:

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

Ответ 4

Я столкнулся с подобной проблемой, пытаясь настроить среду разработки PySpark с Eclipse и PyDev. PySpark использует динамическое пространство имен. Чтобы заставить его работать, мне нужно было добавить PySpark в "Force Builtins", как показано ниже.

Forced builtins

Ответ 5

Добавьте pyspark в принудительные встроенные функции при использовании интерпретатора pydev eclipse IDE.