Python 在pyspark中找不到col函数

Python 在pyspark中找不到col函数,python,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,在pyspark 1.6.2中,我可以通过 from pyspark.sql.functions import col 但是当我试图在functions.py文件中查找它时,我发现没有col函数,python如何导入一个不存在的函数呢。它只是没有明确定义。从pyspark.sql.Functions导出的函数是围绕JVM代码的薄型包装,除了少数需要特殊处理的异常情况外,都是使用helper方法自动生成的 如果你仔细检查来源。此词典用于生成包装器。每个生成的函数直接分配给全局文件中的相应名称 最

在pyspark 1.6.2中,我可以通过

from pyspark.sql.functions import col

但是当我试图在
functions.py
文件中查找它时,我发现没有
col
函数,python如何导入一个不存在的函数呢。它只是没有明确定义。从
pyspark.sql.Functions
导出的函数是围绕JVM代码的薄型包装,除了少数需要特殊处理的异常情况外,都是使用helper方法自动生成的

如果你仔细检查来源。此词典用于生成包装器。每个生成的函数直接分配给
全局文件中的相应名称

最后,定义从模块导出的项目列表的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,只导出除黑名单中包含的项目之外的所有
全局项目

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

  • 使用以下内容创建名为
    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")]
    
  • 将其放置在Python路径的某个位置(例如工作目录中)

  • 导入
    foo

    from foo import foo
    
    foo(1)
    
这种元编程方法的一个不希望出现的副作用是,仅依赖静态代码分析的工具可能无法识别已定义的函数。这不是一个关键问题,在开发过程中可以安全地忽略


根据IDE的不同,安装可能会解决问题(请参见示例)。

我在尝试使用Eclipse和PyDev设置PySpark开发环境时遇到了类似的问题。PySpark使用动态名称空间。为了让它工作,我需要将PySpark添加到“force Builtins”中,如下所示


到代码1.26.1这可以通过修改python.linting.pylintArgs设置来解决:

"python.linting.pylintArgs": [
        "--generated-members=pyspark.*",
        "--extension-pkg-whitelist=pyspark",
        "--ignored-modules=pyspark.sql.functions"
    ]

github上解释了这个问题:

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

一种解决方法是导入
函数
,然后从那里调用
col
函数

例如:

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

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

pip install pyspark-stubs==x.x.x

(在x.x.x必须被pyspark版本(例如,在我的例子中是2.3.0)替换的情况下,
col
和其他函数将被检测到,而不会对大多数IDE(Pycharm、Visual Studio代码、Atom、Jupyter笔记本等)的代码进行任何更改)

正如@zero323所指出的那样,有几个spark函数在运行时通过添加到globals dict,然后将它们添加到
\uuuuu all\uuuu
生成包装器。正如@vincent claes所指出的,使用
函数
路径引用函数(如
F
或其他,我更喜欢更具描述性的方式)可以使导入不会在PyCharm中显示错误。然而,正如@nexaspx在对该答案的评论中所暗示的那样,这将警告转移到了用法行。正如@thomas pyspark所提到的,可以安装存根来改善这种情况

但是,如果出于某种原因,添加该包不是一个选项(可能您正在为您的环境使用docker映像,现在无法将其添加到映像),或者它不起作用,那么我的解决方法是:首先,仅为生成的带有别名的包装添加一个导入,然后仅为该导入禁用检查。这允许所有用法在同一语句中仍对其他函数进行检查,将警告点减少到只有一个,然后忽略该警告

from pyspark.sql import functions as pyspark_functions
# noinspection PyUnresolvedReferences
from pyspark.sql.functions import col as pyspark_col
# ...
pyspark_functions.round(...)
pyspark_col(...)
如果有多个导入,请将它们分组,以便只有一个
noinspection

# noinspection PyUnresolvedReferences
from pyspark.sql.functions import (
    col as pyspark_col, count as pyspark_count, expr as pyspark_expr,
    floor as pyspark_floor, log1p as pyspark_log1p, upper as pyspark_upper,
)
(当我使用
重新格式化文件时,PyCharm就是这样格式化的)


当我们讨论如何导入
pyspark.sql.functions
时,我建议不要从
pyspark.sql.functions
导入单个函数,以避免隐藏Python内置函数,这可能会导致模糊错误,如eclipse中的@SARose.

如果仍然看到错误标记,右键单击project->pydev->代码分析。这应该会去掉标记。对于我来说,这仍然会给出
在'functions.py'中找不到引用'col'。
警告…@nexaspark您的pyspark版本与您的spark版本相同吗?您是否设置了SPARK_HOME环境变量?在Pylint中,这似乎没有帮助。但是在Flake8中,哪一个更好,它确实如此。对于pyspark 2.4.5,我必须使用pyspark存根2.4.0```$pip freeze | grep pyspark pyspark==2.4.4 pyspark存根==2.4.0``我安装了2.4.0,但它仍然不起作用。链接不再存在,这就是我需要的!我将该选项添加到我的
setup.cfg
中,作为
ignored modules=pyspark.sql.functions