我有一个流数据帧,我想对某些列进行min
和avg
。
我想在应用操作后获得单独的 min
和 avg
结果列,而是将最小值和平均输出合并到一列中。
数据帧如下所示:
+-----+-----+
| 1 | 2 |
+-----+-----+-
|24 | 55 |
+-----+-----+
|20 | 51 |
+-----+-----+
我以为我会使用 Scala 元组,但这似乎不起作用:
val res = List("1","2").map(name => (min(col(name)), avg(col(name))).as(s"result($name)"))
使用的所有代码:
val res = List("1","2").map(name => (min(col(name)),avg(col(name))).as(s"result($name)"))
val groupedByTimeWindowDF1 = processedDf.groupBy($"xyz", window($"timestamp", "60 seconds"))
.agg(res.head, res.tail: _*)
我期望应用min
和avg
数学运算后的输出是:
+-----------+-----------+
| result(1)| result(2)|
+-----------+-----------+
|20 ,22 | 51,53 |
+-----------+-----------+
我应该如何写表达式?
使用结构标准函数:
结构体(列名称: 字符串, 列名称: 字符串*): 列
结构体(列: 列*): 列
创建一个由多个输入列组成的新结构列。
这为您提供了值以及(列)的名称。
val res = List("1","2").map(name =>
struct(min(col(name)), avg(col(name))) as s"result($name)")
^^^^^^ HERE
当您想要引用结构中的一个字段并且可以使用名称(而不是索引)时,可以看到struct
的强大功能。
q.select("structCol.name")
您要做的是将多个列的值合并到一个列中。为此,您可以使用array
功能。在这种情况下,它将是:
val res = List("1","2").map(name => array(min(col(name)),avg(col(name))).as(s"result($name)"))
这将给你:
+------------+------------+
| result(1)| result(2)|
+------------+------------+
|[20.0, 22.0]|[51.0, 53.0]|
+------------+------------+