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|
+---+----+-----------+
如果您希望第三行有col1
0,一个聚合就足够了:coalesce(first(when('col1 =!= "N", 'col1), ignoreNulls = true), lit("N"))