【问题标题】:Cannot find col function in pyspark在 pyspark 中找不到 col 函数
【发布时间】:2017-03-02 23:10:48
【问题描述】:

在 pyspark 1.6.2 中,我可以通过以下方式导入 col 函数

from pyspark.sql.functions import col

但是当我尝试在Github source code 中查找时,我在functions.py 文件中找不到col 函数,python 如何导入不存在的函数?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    直接导入所有pyspark函数;

    from pyspark.sql.functions import *
    ...
    col('my_column')
    

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

    from pyspark.sql import functions as f
    ...
    f.col('my_column')
    

    【讨论】:

      【解决方案2】:

      正如@zero323 所指出的,有几个spark 函数在运行时通过添加到全局字典生成包装器,然后将它们添加到__all__。正如@vincent-claes 所指出的,使用function 路径(如F 或其他东西,我更喜欢更具描述性的东西)引用函数可以使导入不会在PyCharm 中显示错误。但是,正如@nexaspx 在对该答案的评论中所暗示的那样,这会将警告转移到使用行。正如@thomas 提到的,可以安装 pyspark-stubs 来改善这种情况。

      但是,如果由于某种原因添加该软件包不是一个选项(也许您正在为您的环境使用 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,
      )
      

      (这是我使用Reformat File 命令时 PyCharm 对其进行格式化的方式)。

      虽然我们讨论的是如何导入 pyspark.sql.functions,但我建议不要从 pyspark.sql.functions 导入各个函数,以避免遮蔽 Python 内置函数,这会导致难以理解的错误,如 @SARose states

      【讨论】:

        【解决方案3】:

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

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

        (必须将 xxx 替换为您的 pyspark 版本(例如,在我的情况下为 2.3.0)),col 和其他功能将被检测到,而无需更改大多数 IDE(Pycharm、Visual Studio Code、Atom、Jupyter Notebook……)

        【讨论】:

        • 对于 pyspark 2.4.5 我必须使用 pyspark-stubs 2.4.0
        • ``` $ pip freeze | grep pyspark pyspark==2.4.4 pyspark-stubs==2.4.0 ``` 我安装了2.4.0,但是还是不行。
        【解决方案4】:

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

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

        例如:

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

        【讨论】:

        • 对我来说,这仍然会给出Cannot find reference 'col' in 'functions.py' 警告...
        • @Nexaspx 你的 pyspark 版本和你的 spark 版本一样吗?你设置 SPARK_HOME 环境变量了吗?
        • 在 Pylint 中,这似乎无济于事。但在更好的 Flake8 中,它确实如此。
        【解决方案5】:

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

        如果您仔细检查来源you'll find col listed among other _functions。这个字典是further iterated_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")]
          
        • 将它放在 Python 路径的某个位置(例如在工作目录中)。

        • 导入foo:

          from foo import foo
          
          foo(1)
          

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

        根据安装 type annotations 的 IDE 可能会解决问题(例如,请参阅 zero323/pyspark-stubs#172)。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 在 eclipse 中如果仍然看到错误标记,请右键单击项目 -> pydev -> 代码分析。这应该带走标记
          【解决方案7】:

          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

          【讨论】:

          • 链接不存在了,js
          • 这就是我需要的!我将选项添加到我的setup.cfgignored-modules = pyspark.sql.functions
          猜你喜欢
          • 2023-03-15
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 2023-01-14
          • 2022-08-04
          • 2020-03-02
          • 2020-08-27
          相关资源
          最近更新 更多