Scala 如何将两列或多列合并为一列?
我有一个流数据帧,我想在一些列上计算Scala 如何将两列或多列合并为一列?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个流数据帧,我想在一些列上计算min和avg val res = List("1","2").map(name => struct(min(col(name)), avg(col(name))) as s"result($name)") ^^^^^^ HERE 在应用这些操作后,我不想得到单独的min和avg结果列,而是想将min和average输出合并到一个列中 数据帧如下所示: +-----+-----+ | 1 | 2 | +-----
min
和avg
val res = List("1","2").map(name =>
struct(min(col(name)), avg(col(name))) as s"result($name)")
^^^^^^ HERE
在应用这些操作后,我不想得到单独的min
和avg
结果列,而是想将min和average输出合并到一个列中
数据帧如下所示:
+-----+-----+
| 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 => array(min(col(name)),avg(col(name))).as(s"result($name)"))
这将给你:
+------------+------------+
| result(1)| result(2)|
+------------+------------+
|[20.0, 22.0]|[51.0, 53.0]|
+------------+------------+
使用标准功能:
struct(colName:String,colNames:String*):Column
struct(cols:Column*):Column
创建由多个输入列组成的新结构列
这将为您提供(列的)值和名称
当您想要引用结构中的一个字段并且可以使用名称(而不是索引)时,可以看到struct
的威力
谢谢,另外还有如何将列名与DF行合并。我想要这个格式的结果[20.0,22.0,结果(1)]。应该如何表达?val res=List(“1”,“2”).map(name=>array(min(col(name)),avg(col(name))).as(s“result($name)”)@shrikrishna:如果我理解正确,您想将列名添加到数组中吗?老实说,这似乎很不方便,但您可以将其添加到
lit(s“result$name”)
@Shaido中,这对我很有用。我需要ForeachWriter的列名,以便进一步操作和DB sink类。有更好的设计吗?@shrikrishna:我想有,但这取决于你的实际情况,我建议你提出一个新的问题,并提供更多细节。
q.select("structCol.name")