2017-05-18 4 views
1

spark sqlの複数の列でSQLを呼び出す方法は簡単です。例えばSpark SQL:指定されたすべての列に特定の関数を適用する方法

、のは、私が最も列

select 
min(c1) as min, 
max(c1) as max, 
max(c1) - min(c1) range 
from table tb1 

複数の列がある場合に適用されなければならないクエリがあるとしましょう、すべての列に対するクエリを実行すると、1を結果として得る方法があります時間。

df.describeと同様です。

答えて

1

データフレームに含まれているメタデータ(この場合は列)を使用します(これは、すでに列名を取得していない場合はspark.table("<table_name>")で取得できます)。 。df.select(またはdf.selectExpr

ビルドいくつかのテストデータ:

scala> var seq = Seq[(Int, Int, Float)]() 
seq: Seq[(Int, Int, Float)] = List() 

scala> (1 to 1000).foreach(n => { seq = seq :+ (n,r.nextInt,r.nextFloat) }) 

scala> val df = seq.toDF("id", "some_int", "some_float") 

は、我々はすべての列で実行するいくつかの関数を表す:

scala> val functions_to_apply = Seq("min", "max") 
functions_to_apply: Seq[String] = List(min, max) 

セットアップSQLの列の最後の配列:

scala> df.select(select_columns:_*).show 

+-------+-------+-------------+-------------+---------------+---------------+ 
|min(id)|max(id)|min(some_int)|max(some_int)|min(some_float)|max(some_float)| 
+-------+-------+-------------+-------------+---------------+---------------+ 
|  1| 1000| -2143898568| 2147289642| 1.8781424E-4|  0.99964607| 
+-------+-------+-------------+-------------+---------------+---------------+ 

scala> val cols = df.columns 

scala> cols.foreach(col => { functions_to_apply.foreach(f => {select_columns = select_columns :+ expr(s"$f($col)")})}) 

は、実際のクエリを実行します。列と機能を超える

scala> var select_columns = Seq[org.apache.spark.sql.Column]() 
select_columns: Seq[org.apache.spark.sql.Column] = List() 

反復がselect_columns配列を移入するために適用します

関連する問題