如何将两列或多列合并为一列



我有一个流数据帧,我想对某些列进行minavg

我想在应用操作后获得单独的 minavg 结果列,而是将最小值和平均输出合并到一列中。

数据帧如下所示:

+-----+-----+
|  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: _*) 

我期望应用minavg数学运算后的输出是:

+-----------+-----------+
|  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]|
+------------+------------+

相关内容

  • 没有找到相关文章

最新更新