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



以下是一些语句:https://stackoverflow.com/a/45600938/4164722

dataset.col返回解决的列,而col返回未解决的列。

有人可以提供更多细节吗?我什么时候应该使用Dataset.col()和何时functions.col

谢谢。

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

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不可能。

说明

有时您可能需要通过编程性预先创建(即提前)column expressions以供稍后使用 - 在相关的数据帧实际上存在之前。在该用例中,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列,因为它们与数据帧语句无关,以实际知道这些列名是否实际上存在于任何地方。但是,实际上,您可以在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)可以通过编程方式将其定义 application 定义与dataframe(s)的 application 进行。请注意,expr(aString)(也返回column specification)提供了col('xyz')的概括,其中整个表达式可以定义及以后的 applatied :

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

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

相关内容

  • 没有找到相关文章

最新更新