scala - 在数据帧上分组
问题描述
我有一个数据框 df,其中包含 a、b、c、d、e、f、g 列。
我有一个 scala List L1,它是 List[Any] = List(a,b,c)
如何对 DF 执行分组操作并使用列表 L1 查找重复项(如果有)
还如何找出数据框是否具有列表 L1 中提到的列的空值/空白/空值
例如 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"), 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 |
// +----+----+----+-----+
推荐阅读
- angular - 通过防护装置保护角度偏差
- wordpress - 如何在 wordpress 循环中显示一个或另一个类别的帖子?
- html - 如何左对齐文本?
- python - Python 连接到 Oracle 数据库错误 DPI-1047
- r - 删除R中数据框中的数字和数字后面的句点?
- javascript - Vuejs:数据属性更改时组件不会重新渲染
- flutter - 计数器不改变其状态
- dataframe - 读取Parquet文件时spark如何决定列顺序
- javascript - 粘性导航栏,滚动到第一个元素不精确
- javascript - 在 webpack 中,CompatibilityPlugin 做了什么?