我解释说,
spark的sum函数
可以用字符串列名工作。然而,当使用
column name
或
column object
时,我看到不同的结果。
schema = ["department", "employee", "knwos_ops", "developer"]
data = [("frontend", "john", 0, 1,), ("frontend", "jenny", 1, 1,), ("frontend", "michael", 0, 1,)]
input_df = spark.createDataFrame(data, schema=schema)
input_df.show(5, False)
+----------+--------+---------+---------+
|department|employee|knwos_ops|developer|
+----------+--------+---------+---------+
|frontend |john |0 |1 |
|frontend |jenny |1 |1 |
|frontend |michael |0 |1 |
+----------+--------+---------+---------+
input_df \
.groupBy(*["department"]) \
.agg( \
f.sum("developer").alias("dev"), \
f.sum(f.when(f.col("knwos_ops") == 1, "developer")).alias("devops"), \
f.sum("knwos_ops").alias("ops"),
).show(5, False)
+----------+---+------+---+
|department|dev|devops|ops|
+----------+---+------+---+
|frontend |3 |null |1 |
+----------+---+------+---+
input_df \
.groupBy(*["department"]) \
.agg( \
f.sum("developer").alias("developer"), \
f.sum(f.when(f.col("knwos_ops") == 1, f.col("developer"))).alias("devops"), \
f.sum("knwos_ops").alias("ops"),
).show(5, False)
+----------+---+------+---+
|department|dev|devops|ops|
+----------+---+------+---+
|frontend |3 |1 |1 |
+----------+---+------+---+
我对函数sum
和when
的理解如下。
函数when
,如果条件符合,则返回值,否则返回null。
函数sum
通过使用字符串类型的列名或Column类型的列名。
基于此,在第一个聚合例子中,函数when
中的条件应该返回列developer
的名称为字符串,这应该被函数sum
用来聚合并返回2。但是它却返回空值。
为什么Spark不能识别developer
是数据框架的一个列。谁能帮助我理解这背后的文档?
谢谢你的回答。正如我在第二次聚合中所做的,我有办法解决这个问题。我正在寻找这种行为背后的解释,有人指出了我对sum
。
让我这样重新表述一下。如果函数sum得到的参数是字符串,它就会试图在数据框架中找到同名的列。
#### sum function receives string as argument, and finds the column and does the sum
input_df.agg(f.sum("developer")).show(5, False)
+--------------+
|sum(developer)|
+--------------+
|3 |
+--------------+
#### sum function receives string as argument, and finds the column and does the sum. Field type is string so it return null
input_df.agg(f.sum("employee")).show(5, False)
+--------------+
|sum(developer)|
+--------------+
|null |
+--------------+
#### sum function receives string as argument, and does not find the column and throws error
input_df.agg(f.sum("manager")).show(5, False)
Py4JJavaError: An error occurred while calling o839.agg.
: org.apache.spark.sql.AnalysisException: cannot resolve '`manager`' given input columns: [department, employee, knwos_ops, developer];
根据上面的片段,我希望函数when
会返回字符串developer
,而
我希望函数sum
将使用该字符串来解决该字符串中的列并进行聚合。