如何在使用聚合函数时忽略字符


import org.apache.spark.sql.functions.{first,count}
df.groupBy("grp").agg(first(df("col1"), ignoreNulls = true), count("col2")).show()

在上述代码中,CCD_ 2的CCD_ 1包含字符CCD_。我需要像ignoreNulls=true一样忽略这一点。

更新

import org.apache.spark.sql.functions.{first, count, when}
df.filter(when(df("col1") =!= "N", true).otherwise(false))
.groupBy("grp")
.agg(first(df("col1"), ignoreNulls = true), count("col2"))
.show()
  • 使用筛选器排除col1 val='N'处的行
  • 将筛选后的DataFrame传递到groupBy+相同聚合
  • 使用first和ignoreNulls=true来获取组中的第一个非null值+col2中的count个非null

据我所知,您想要得到col1的第一个元素,而不是N。如果除了N之外没有其他元素,则需要获得N。我假设如果所有元素都为null,那么您希望获得null。

在这种情况下,让我们对聚合执行。一个忽略N,一个不合并结果的:

val df = Seq((1, Some("N"), 1), (1, Some("N"), 2), (2, Some("N"), 3),
(2, Some("A"), 4), (3, None, 5)
).toDF("grp", "col1", "col2")
df
.groupBy("grp")
.agg(coalesce(
first(when('col1 =!= "N", 'col1), ignoreNulls = true),
first('col1, ignoreNulls = true)
).alias("col1"), count("col2"))
.show()
+---+----+-----------+
|grp|col1|count(col2)|
+---+----+-----------+
|  1|   N|          2|
|  2|   A|          2|
|  3|null|          1|
+---+----+-----------+

如果您希望第三行有col10,一个聚合就足够了:coalesce(first(when('col1 =!= "N", 'col1), ignoreNulls = true), lit("N"))

相关内容

  • 没有找到相关文章

最新更新