group-by

aiqt4smr  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(479)

我有一个Dataframedf和列a,b,c,d,e,f,g。
我有一个scala列表l1,它是list[any]=list(a,b,c)
如何在df上执行group by操作并使用列表l1查找重复项(如果有)
另外,如何找出Dataframe是否对列表l1中提到的列具有nulls/blanks/emptyvalue
e、 g.需要使用df.groupby(l1),因为l1可能会随时间而变化

mrphzbgm

mrphzbgm1#

// 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"),  None, 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    |
//  +----+----+----+-----+

相关问题