在pyspark中找不到col函数

Bam*_*mqf 32 python apache-spark apache-spark-sql pyspark pyspark-sql

在pyspark 1.6.2中,我可以导入col函数

from pyspark.sql.functions import col
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在Github源代码中查找它时,我发现文件中没有col函数,functions.pypython如何导入一个不存在的函数?

use*_*411 36

它存在.它没有明确定义.从中导出的函数pyspark.sql.functions是围绕JVM代码的瘦包装器,除了一些需要特殊处理的例外,它们是使用辅助方法自动生成的.

如果你仔细检查你会发现col列出_functions的来源.该字典进一步迭代_create_function用于生成包装器.每个生成的函数都直接分配给中的相应名称globals.

最后__all__,它定义了从模块导出的项目列表,只导出globals黑名单中包含的所有排除项目.

如果这个机制仍然不清楚,你可以创建一个玩具示例:

  • foo.py使用以下内容创建调用的Python模块:

    # 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")]
    
    Run Code Online (Sandbox Code Playgroud)
  • 将它放在Python路径上的某个位置(例如在工作目录中).

  • 进口foo:

    from foo import foo
    
    foo(1)
    
    Run Code Online (Sandbox Code Playgroud)

这种元编程方法的一个不希望的副作用是,工具可能无法识别定义的函数,这完全取决于静态代码分析.这不是一个关键问题,可以在开发过程中安全地忽略.

根据IDE安装类型,注释可能会解决问题.


Vin*_*aes 31

在 Pycharm 中,col函数和其他函数被标记为“未找到”

在此处输入图片说明

一种解决方法是从那里导入functions并调用该col函数。

例如:

from pyspark.sql import functions as F
df.select(F.col("my_column"))
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这仍然给出“在‘functions.py’中找不到引用‘col’’警告...... (8认同)

Tho*_*mas 15

如上所述,pyspark 会动态生成一些函数,这使得大多数 IDE 无法正确检测它们。但是,有一个 python 包pyspark-stubs,其中包含一组存根文件,以便改进类型提示、静态错误检测、代码完成,...只需安装

pip install pyspark-stubs==x.x.x
Run Code Online (Sandbox Code Playgroud)

(其中 xxx 必须替换为您的 pyspark 版本(例如在我的情况下为 2.3.0)),col并且将检测其他功能,而无需更改大多数 IDE(Pycharm、Visual Studio Code、Atom、Jupyter)的代码中的任何内容笔记本, ...)

  • 对于 pyspark 2.4.5 我必须使用 pyspark-stubs 2.4.0 (2认同)

Dmy*_*tro 10

VS Code 1.26.1开始, 可以通过修改python.linting.pylintArgs设置来解决:

"python.linting.pylintArgs": [
        "--generated-members=pyspark.*",
        "--extension-pkg-whitelist=pyspark",
        "--ignored-modules=pyspark.sql.functions"
    ]
Run Code Online (Sandbox Code Playgroud)

该问题在github上得到了解释:https : //github.com/DonJayamanne/pythonVSCode/issues/1418#issuecomment-411506443


bek*_*kce 9

直接导入所有pyspark函数;

from pyspark.sql.functions import *
...
col('my_column')
Run Code Online (Sandbox Code Playgroud)

您可能还想使用别名来解决函数阴影问题;

from pyspark.sql import functions as f
...
f.col('my_column')
Run Code Online (Sandbox Code Playgroud)