我发现很难理解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'>
那么两者之间的区别是什么?我何时应该使用一个而不是另一个?
答案 0 :(得分:10)
doc说:
西:
根据给定的列名返回一个列。
亮:
创建一个文字值列
假设我们有一个如下数据框:
>>> 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|
+---+
如果使用col
从A
创建新列:
>>> df.withColumn("new", F.col("A")).show()
+---+---+
| A|new|
+---+---+
| a| a|
| b| b|
| c| c|
+---+---+
因此col
抓取具有给定名称的现有列,F.col("A")
相当于此处的df.A
或df["A"]
。
如果使用F.lit("A")
创建列:
>>> df.withColumn("new", F.lit("A")).show()
+---+---+
| A|new|
+---+---+
| a| A|
| b| A|
| c| A|
+---+---+
虽然lit
将创建一个以给定字符串作为值的常量列。
它们都返回一个Column对象,但内容和含义不同。