Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将两列或多列合并为一列?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

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")