col("col_name")与df.col_name两种列引用方式有什么区别?
两种DataFrame列引用写法的差异对比
以下对比基于PySpark DataFrame的常用场景:
核心共性
在单表简单过滤、列名都是合法Python标识符的常规场景下,两种写法的执行逻辑、返回结果、执行性能没有任何差异,仅写法风格不同
核心差异
- 绑定逻辑差异
col('first_name')生成的是不绑定任何具体DataFrame的通用列对象,只要目标DataFrame存在该列就可以使用,同一个列表达式可以复用到多个同结构的DataFrame操作中;df.first_name是和当前df实例强绑定的列对象,仅能用于这个df的相关操作,无法直接复用给其他DataFrame。 - 特殊列名兼容性差异
如果列名包含空格、特殊字符,或是和DataFrame自带的方法/属性重名(比如列名设置为count、filter这类DataFrame本身就有的方法名),df.列名的点式调用会直接触发语法错误或者逻辑异常,此时只能使用col()函数或者df['列名']的写法完成合法的列引用。 - 链式调用适配差异
编写无中间临时变量的链式操作时,col()函数不需要依赖中间结果的变量名,写法更简洁流畅。举个实际例子:
# 使用col函数的写法,无需定义中间变量 df.join(other_df, on='user_id').filter(col('first_name').isin([3, 4, 7])) # 使用df.列名的写法,必须先把join的结果赋值给新变量才能正常引用列 joined_df = df.join(other_df, on='user_id') result = joined_df.filter(joined_df.first_name.isin([3, 4, 7]))
- 多表操作适用性差异
进行多表关联、联合查询等存在同名列的操作时,col()可以搭配表别名更灵活的完成列引用,不需要提前绑定不同表对应的变量。
内容的提问来源于stack exchange,提问作者N_A
相关产品推荐
相关产品推荐

