尝试从 python 3.5 中的 pyspark.sql.functions 导入 col 时未解决的引用

Unresolved reference while trying to import col from pyspark.sql.functions in python 3.5

这里参考post: Spark structured streaming with python 我想在 python 3.5

中导入 'col'
from pyspark.sql.functions import col

但是我收到一条错误消息,指出未解决对 col 的引用。我已经安装了 pyspark 库,所以只是想知道 'col' 是否已从 pyspark 库中删除?那么我该如何导入 'col'。

原来是IntelliJ IDEA的问题。即使它显示未解析的引用,我的程序仍然可以在命令行中正常运行。

这似乎是 PyCharm 编辑器的问题,我也可以通过 Python 控制台 运行 使用 trim() 进行编程。

尝试安装 'pyspark-stubs',我在 PyCharm 中遇到了同样的问题,通过安装我解决了它。

col这样的函数并不是python代码中定义的显式函数,而是动态生成的。

用静态分析工具也会报错pylint

所以最简单的使用方法应该是这样的

from pyspark.sql import functions as F

F.col("colname")

下面的代码在python/pyspark/sql/functions.py

_functions = {
    'lit': _lit_doc,
    'col': 'Returns a :class:`Column` based on the given column name.',
    'column': 'Returns a :class:`Column` based on the given column name.',
    'asc': 'Returns a sort expression based on the ascending order of the given column name.',
    'desc': 'Returns a sort expression based on the descending order of the given column name.',

    'upper': 'Converts a string expression to upper case.',
    'lower': 'Converts a string expression to upper case.',
    'sqrt': 'Computes the square root of the specified float value.',
    'abs': 'Computes the absolute value.',

    'max': 'Aggregate function: returns the maximum value of the expression in a group.',
    'min': 'Aggregate function: returns the minimum value of the expression in a group.',
    'count': 'Aggregate function: returns the number of items in a group.',
    'sum': 'Aggregate function: returns the sum of all values in the expression.',
    'avg': 'Aggregate function: returns the average of the values in a group.',
    'mean': 'Aggregate function: returns the average of the values in a group.',
    'sumDistinct': 'Aggregate function: returns the sum of distinct values in the expression.',
}

def _create_function(name, doc=""):
    """ Create a function for aggregator by name"""
    def _(col):
        sc = SparkContext._active_spark_context
        jc = getattr(sc._jvm.functions, name)(col._jc if isinstance(col, Column) else col)
        return Column(jc)
    _.__name__ = name
    _.__doc__ = doc
    return _

for _name, _doc in _functions.items():
    globals()[_name] = since(1.3)(_create_function(_name, _doc))