pyspark.sql.functions.col 和 pyspark.sql.functions.lit 之间的 PySpark 区别

Posted

技术标签:

【中文标题】pyspark.sql.functions.col 和 pyspark.sql.functions.lit 之间的 PySpark 区别【英文标题】:PySpark difference between pyspark.sql.functions.col and pyspark.sql.functions.lit 【发布时间】:2017-09-24 04:10:39 【问题描述】:

我很难从pyspark.sql.functions 中理解这两种方法之间的区别,因为 PySpark 官方网站上的文档信息量不是很大。比如下面的代码:

import pyspark.sql.functions as F
print(F.col('col_name'))
print(F.lit('col_name'))

结果是:

Column<b'col_name'>
Column<b'col_name'>

那么两者之间有什么区别,我什么时候应该使用一个而不是另一个?

【问题讨论】:

【参考方案1】:

doc 说:

col:

根据给定的列名返回一个列。

点亮:

创建一个字面值列


如果我们有如下的数据框:

>>> import pyspark.sql.functions as F
>>> from pyspark.sql.types import *

>>> schema = StructType([StructField('A', StringType(), True)])
>>> df = spark.createDataFrame([("a",), ("b",), ("c",)], schema)
>>> df.show()
+---+
|  A|
+---+
|  a|
|  b|
|  c|
+---+

如果使用colA 创建一个新列:

>>> df.withColumn("new", F.col("A")).show()
+---+---+
|  A|new|
+---+---+
|  a|  a|
|  b|  b|
|  c|  c|
+---+---+

所以col 抓取具有给定名称的现有列,F.col("A") 在此处等效于df.Adf["A"]

如果使用F.lit("A") 创建列:

>>> df.withColumn("new", F.lit("A")).show()
+---+---+
|  A|new|
+---+---+
|  a|  A|
|  b|  A|
|  c|  A|
+---+---+

lit 将创建一个以给定字符串作为值的常量列。

两者都返回一个Column对象,但内容和含义不同。

【讨论】:

很好地解释和“图解”。我想知道,给定标识符myLitmyCol,分别由F.lit(...)F.col(...) 创建,是否可以询问他们以了解他们未来的解释是什么。又或许它是由 Catalyst 创造并深埋的绑定。两者的dir(...) 没有任何区别,尽管这个例子证明存在。

以上是关于pyspark.sql.functions.col 和 pyspark.sql.functions.lit 之间的 PySpark 区别的主要内容,如果未能解决你的问题,请参考以下文章