为什么在使用Spark sql筛选特定聚合的行时为什么出现类型不匹配?

时间:2019-08-28 09:49:31

标签: scala dataframe apache-spark parquet

所以我有这个数据帧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对吗?

1 个答案:

答案 0 :(得分:2)

您想要的是一列布尔值,而!=返回一个布尔值而不是一列。 Spark为列定义了两个相等运算符:等于===和不等于=!=。两者都返回一列布尔值,这是两个被比较列的元素进行比较的结果。

简而言之,将$"sheep_color" != ""更改为$"sheep_color" =!= ""即可解决错误。


有关为什么使用===而不是==的更多见解可以在这里找到:Difference between == and === in Scala, Spark