【问题标题】:What are the advantages of using column objects instead of strings in PySpark在 PySpark 中使用列对象而不是字符串有什么好处
【发布时间】:2020-11-09 08:58:49
【问题描述】:

在 PySpark 中,可以使用列对象和字符串来选择列。两种方式都返回相同的结果。有什么区别吗?什么时候应该使用列对象而不是字符串? 例如,我可以使用列对象:

import pyspark.sql.functions as F

df.select(F.lower(F.col('col_name')))
# or
df.select(F.lower(df['col_name']))
# or
df.select(F.lower(df.col_name))

或者我可以使用字符串来获得相同的结果:

df.select(F.lower('col_name'))

在 PySpark 中使用列对象代替字符串有什么好处

【问题讨论】:

    标签: python dataframe apache-spark select pyspark


    【解决方案1】:

    阅读 Palantir here 的 PySpark 风格指南,其中解释了何时使用 F.col() 而不是最佳实践。 Git 链接here

    在许多情况下,第一种样式可以更简单、更短且视觉上的污染更少。但是,我们发现它面临许多限制,导致我们更喜欢第二种样式:

    如果数据框变量名很大,涉及它的表达式很快就会变得笨拙; 如果列名包含空格或其他不受支持的字符,则必须改用括号运算符。这会产生不一致,而 df1['colA']F.col('colA') 一样难写; 涉及数据框的列表达式不可重用,不能用于定义抽象函数; 重命名数据框变量可能容易出错,因为必须同时更新所有列引用。 此外,点语法鼓励对数据帧使用简短且非描述性的变量名称,我们发现这对可维护性有害。请记住,数据框是数据的容器,描述性名称有助于快速设定对其中所含内容的期望。

    相比之下,在这种情况下,F.col('colA') 将始终引用正在操作的数据帧中名为 colA 的列,名为 df。它根本不需要跟踪其他数据帧的状态,因此代码变得更加本地化,​​不太容易受到“幽灵般的远距离交互”的影响,这通常很难调试。

    【讨论】:

    • 不知道那个。很高兴拥有。
    • 是的.. 该风格指南非常值得关注
    • 您基本上在这里比较不同的列对象:df1['colA']F.col('colA')。 'colA' 和 F.col('colA') 有什么区别。 “colA”没有数据框名称。
    【解决方案2】:

    这取决于函数在 Scala 中是如何实现的。 在 scala 中,函数的签名是函数本身的一部分。例如,func(foo: str)func(bar: int) 是两个不同的函数,Scala 可以根据您使用的参数类型决定调用其中一个还是另一个。

    F.col('col_name'))df['col_name']df.col_name 是同一类型的对象,一列。使用一种或另一种语法几乎相同。有点不同的是,您可以编写例如:

    df_2.select(F.lower(df.col_name))  # Where the column is from another dataframe 
    # Spoiler alert : It may raise an error !!
    

    当你调用df.select(F.lower('col_name'))时,如果函数lower(smth: str)没有在Scala中定义,那么你会报错。一些函数使用 str 作为输入定义,其他函数仅使用 columns 对象。试试看它是否有效,然后使用它。否则,您可以在 spark 项目上发出拉取请求以添加新签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2010-11-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多