按数据框分组

问题描述

我有一个数据框df,其中包含a,b,c,d,e,f,g列。

我有一个scala列表L1,它是List [Any] = List(a,b,c)

如何在DF上执行分组操作以及如何使用列表L1查找重复项

同样如何找出数据框是否具有列表L1中提到的列的null / blanks / emptyvalues

例如需要使用df.groupby(l1),因为l1可能会随时变化

解决方法

// Null
case class Source(
                   a: Option[String],b: Option[String],c: Option[String],d: Option[String],e: Option[String],f: Option[String],g: Option[String] )

val l = List("a","b","c")


val sourceDF = Seq(
  Source(None,Some("b1"),Some("c1"),Some("d1"),Some("e1"),Some("f1"),Some("g1")),Source(Some("a2"),None,Some("c2"),Some("d2"),Some("e2"),Some("f2"),Some("g2")),Source(Some("a3"),Some("b3"),Some("d3"),Some("e3"),Some("f3"),Some("g3")),Source(Some("a4"),Some("b4"),Some("c4"),Some("d4"),Some("e4"),Some("f4"),Some("g4"))
).toDF()

sourceDF.show(false)
//  +----+----+----+---+---+---+---+
//  |a   |b   |c   |d  |e  |f  |g  |
//  +----+----+----+---+---+---+---+
//  |null|b1  |c1  |d1 |e1 |f1 |g1 |
//  |a2  |null|c2  |d2 |e2 |f2 |g2 |
//  |a3  |b3  |null|d3 |e3 |f3 |g3 |
//  |a4  |b4  |c4  |d4 |e4 |f4 |g4 |
//  +----+----+----+---+---+---+---+


val f1 = l.map(i => s" $i is null").mkString(" or ")
sourceDF.where(f1).show(false)

//  +----+----+----+---+---+---+---+
//  |a   |b   |c   |d  |e  |f  |g  |
//  +----+----+----+---+---+---+---+
//  |null|b1  |c1  |d1 |e1 |f1 |g1 |
//  |a2  |null|c2  |d2 |e2 |f2 |g2 |
//  |a3  |b3  |null|d3 |e3 |f3 |g3 |
//  +----+----+----+---+---+---+---+

// groupBy

val gbDF = sourceDF.groupBy(l.head,l.tail:_*).count()
gbDF.show(false)
//  +----+----+----+-----+
//  |a   |b   |c   |count|
//  +----+----+----+-----+
//  |a2  |null|c2  |1    |
//  |a4  |b4  |c4  |1    |
//  |a3  |b3  |null|1    |
//  |null|b1  |c1  |1    |
//  +----+----+----+-----+