所以我有这个数据帧sheepDF
:
--------------------------------------
| sheep_id | sheep_age | sheep_color |
--------------------------------------
| 1 | 1 | gray |
| 2 | 2 | grey |
| 3 | 2 | |
| 4 | 3 | white |
| 5 | 3 | |
--------------------------------------
我想按sheep_age
分组,但从聚合中排除空字符串。所以结果应该是这样的:
--------------------------------------
| sheep_id | sheep_age | sheep_color |
--------------------------------------
| 1 | 1 | gray |
| 2,3 | 2 | grey |
| 4,5 | 3 | white |
--------------------------------------
代替此:
--------------------------------------
| sheep_id | sheep_age | sheep_color |
--------------------------------------
| 1 | 1 | gray |
| 2,3 | 2 | grey, |
| 4,5 | 3 | white, |
--------------------------------------
我尝试按照this solution来解决问题。
这是我的代码:
def get: DataFrame = {
sheepDF
.select(
$"sheep_id".as("sheep_id"),
$"sheep_age".as("sheep_age"),
$"sheep_color".as("sheep_color")
)
.groupBy(
$"sheep_age"
)
.agg(
concat_ws(",",
collect_list(
$"sheep_id"
))
.as("sheep_ids"),
concat_ws(",",
collect_list(
when($"sheep_color" != "", $"sheep_color")
))
.as("sheep_colors")
)
}
但是,我得到了这个错误:
type mismatch;
[error] found : Boolean
[error] required: org.apache.spark.sql.Column
[error] when($"sheep_color" != "",
[error] ^
为什么它告诉我required: org.apache.spark.sql.Column
?我想念什么? When
函数应该需要Boolean
对吗?
答案 0 :(得分:2)
您想要的是一列布尔值,而!=
返回一个布尔值而不是一列。 Spark为列定义了两个相等运算符:等于===
和不等于=!=
。两者都返回一列布尔值,这是两个被比较列的元素进行比较的结果。
简而言之,将$"sheep_color" != ""
更改为$"sheep_color" =!= ""
即可解决错误。
有关为什么使用===
而不是==
的更多见解可以在这里找到:Difference between == and === in Scala, Spark