【问题标题】:What's the difference between Dataset.col() and functions.col() in Spark?Spark 中的 Dataset.col() 和 functions.col() 有什么区别?
【发布时间】:2021-04-08 22:33:13
【问题描述】:

这里有一些声明:https://stackoverflow.com/a/45600938/4164722

Dataset.col 返回已解析的列,而 col 返回未解析的列。

谁能提供更多细节?我应该什么时候使用Dataset.col(),什么时候使用functions.col

谢谢。

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    在大多数情况下没有实际区别。例如:

    val df: Dataset[Row] = ???
    
    df.select(df.col("foo"))
    df.select(col("foo"))
    

    等价,等同于:

    df.where(df.col("foo") > 0)
    df.where(col("foo") > 0)
    

    当出处很重要时,差异变得很重要,例如连接:

    val df1: Dataset[Row] = ???
    val df2: Dataset[Row] = ???
    
    df1.join(df2, Seq("id")).select(df1.col("foo") =!= df2.col("foo"))
    

    因为Dataset.col 已解析并绑定到DataFrame,它允许您明确选择从特定父级降序的列。 col 是不可能的。

    【讨论】:

      【解决方案2】:

      解释

      有时您可能希望以编程方式预先创建(即提前)column expressions 以供以后使用——在相关 DataFrame 实际存在之前。在该用例中,col(expression) 可能很有用。一般使用pySpark语法说明:

      >>> cX = col('col0')  # Define an unresolved column.                                                                           
      >>> cY = col('myCol') # Define another unresolved column.                                                  
      >>> cX,cY             # Show that these are naked column names.                                                                                            
      (Column<b'col0'>, Column<b'myCol'>)
      

      现在这些被称为unresolved 列,因为它们不与 DataFrame 语句关联以实际知道这些列名称是否实际存在于任何地方。然而,事实上,您可以在准备好它们之后在 DF 上下文中应用它们:

      >>> df = spark_sesn.createDataFrame([Row(col0=10, col1='Ten', col2=10.0),])                                
      >>> df                                                                                                     
      >>> DataFrame[col0: bigint, col1: string, col2: double]
      
      >>> df.select(cX).collect()                                                                                
      [Row(col0=10)]                      # cX is successfully resolved.
      
      >>> df.select(cY).collect()                                                                                
      Traceback (most recent call last):  # Oh dear! cY, which represents
      [ ... snip ... ]                    # 'myCol' is truly unresolved here.
                                          # BUT maybe later on it won't be, say,
                                          # after a join() or something else.
      

      结论:

      col(expression) 可以帮助以后以编程方式将列规范的 DEFINITION 与它的 APPLICATION 与 DataFrame(s) 解耦。请注意,expr(aString) 也返回 column specification,它提供了 col('xyz') 的泛化,其中整个表达式可以DEFINED 和以后APPLIED

      >>> cZ = expr('col0 + 10')   # Creates a column specification / expression.
      >>> cZ
      Column<b'(col0 + 10)'>
      
      >>> df.select(cZ).collect() # Applying that expression later on.
      [Row((col0 + 10)=20)]
      

      我希望这个替代用例有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        • 2010-12-28
        • 2021-08-08
        • 2019-11-13
        • 1970-01-01
        • 2016-05-27
        相关资源
        最近更新 更多