Spark中的Dataset.col()和functions.col()有什么区别?

时间:2017-12-25 01:37:10

标签: apache-spark apache-spark-sql

以下是一些陈述:https://stackoverflow.com/a/45600938/4164722

  

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

有人可以提供更多详情吗?我应该何时使用Dataset.col()functions.col

感谢。

2 个答案:

答案 0 :(得分:7)

在大多数情况下,没有实际差异。例如:

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无法实现。

答案 1 :(得分:1)

有时,您可能需要以编程方式(即提前)创建column expressions以便以后使用-在相关的DataFrame实际存在之前。在这种情况下,col(expression)可能会有用。使用pySpark语法进行一般说明:

>>> cX = col('col0')  # Define an unresolved column.                                                                           
>>> cY = col('myCol') # Define another one.                                                  
>>> 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 successfully resolved.

>>> df.select(cY).collect()                                                                                
Traceback (most recent call last):  # Oh dear, cY is truly unresolved.
                                    # But maybe later it won't be.
[ ... snip ... ]

因此,我想col(expression)可以帮助以编程方式将列规范的定义与稍后针对DataFrame的应用程序脱钩。 expr(aString)还返回列说明,它对此进行了概括:

>>> 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)]

我希望另类观点能有所帮助。