Scala 将foreach变量传递给spark sql以计算spark中的和

Scala 将foreach变量传递给spark sql以计算spark中的和,scala,apache-spark,apache-spark-sql,spark-streaming,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,Spark Dataframe,我试图将数组中获取的列名传递给spark sql,但不确定如何将其作为变量传递。 我已经创建了一个dataframe并获取了变量x中的所有列,现在我正在创建一个foreach循环来创建一个查询字符串,以便在下一步中进行查询。 我们如何处理这个问题?最终结果应该是“dftable”中各个列的总和。请帮忙 df.createOrReplaceTempView(“dftable”) // collect an array of columns val x= df.schema.

我试图将数组中获取的列名传递给spark sql,但不确定如何将其作为变量传递。 我已经创建了一个dataframe并获取了变量x中的所有列,现在我正在创建一个foreach循环来创建一个查询字符串,以便在下一步中进行查询。 我们如何处理这个问题?最终结果应该是“dftable”中各个列的总和。请帮忙

    df.createOrReplaceTempView(“dftable”)

   // collect an array of columns
   val x=  df.schema.fieldNames

  // create query string for the columns fetched above
   x.foreach { y => "select sum(x) from dftable”}

  // pass variable to query in spark.sql
   spark.sql("select y from dftable”)

对于垂直解决方案:您可以合并多个数据帧

val dfs = x.map(field => spark.sql(s"select '$field' as fieldName, sum($field) from dftable"))
val withSum = dfs.reduce((x, y) => x.union(y)).distinct()
也许这会有帮助

val sums = x.map(y => s"sum($y)").mkString(", ")
spark.sql(s"select $sums from dftable");
总和的格式为:“总和(字段1)、总和(字段2)”

您还可以使用DSL:

import org.apache.spark.sql.functions._
val sums = for (field <- x) yield { sum(col(field)) }
df.agg(sums : _*)
import org.apache.spark.sql.functions_

val sums=for(field我希望这会有所帮助

import org.apache.spark.sql.functions._
import spark.implicits._
val df1 = Seq((1,2,3), (3,4,5), (1,2,4)).toDF("A", "B", "C")
df1.describe().show()


val exprs = df1.columns.map(c => sum(col(c))).toList

df1.agg(lit(1).alias("temp"),exprs: _*).drop("temp")
输出:

+------+------+------+
|sum(A)|sum(B)|sum(C)|
+------+------+------+
|     5|     8|    12|
+------+------+------+

感谢Shankar和T的回答。问题是,我想通过spark sql实现它,因为它将以表格格式对齐数据,而不是像Shankar上面所示的那样水平对齐。我将保留问题。非常感谢任何帮助。@sabby请查看我的答案:)T.Gaweda你太棒了!棒 极 了就像我想要的那样!一个问题是,如何将其限制为仅应用于整数列..我们可以添加与数据类型相关的限制吗?