1

我試圖將數組中取得的列名傳遞給spark sql,但不知道如何將它作爲變量傳遞。 我創建了一個數據框,並獲取變量x中的所有列,現在我創建了一個foreach循環來創建一個查詢字符串,以在下一步中查詢。 我們如何解決這個問題?最終結果應該是「dftable」中各個列的總和。請幫忙。傳遞foreach變量來觸發sql來計算Spark中的總和

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

回答

1

對於垂直解決方案:可以聯合許多DataFrames

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

結果應該是完全一樣的

+0

由於香卡和T您的回覆。問題是我想通過spark sql來實現它,因爲它將以表格格式對齊數據,但不像上面展示的Shankar那樣水平。我會保持這個問題的開放。任何幫助是極大的讚賞。 – sabby

+0

@sabby請看我的回答:) –

+0

T.Gaweda你真棒!棒極了!就像我想要的那樣!一個問題,如何限制這隻適用於整數列...我們可以添加數據類型相關的限制? – sabby

0

我希望這是有益

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