2017-02-02 17 views
1

スパーク回数と同じクエリ内でフィルタ処理回数

SELECT count(id), sum(if(column1 = 1, 1, 0)) from groupedTable 

のようなものは、単一のパスで合計レコードの数だけでなく、フィルタレコードを実行するために処方することができます。

spark-data-frame APIでこれを実行するにはどうすればよいですか?カウントのうちの1つを元のデータフレームに戻すことを必要とすることなく、

+0

は、あなたがしようとした合計(IF)は、コードの下に使用してデータの上にハイブのテーブルを作成する必要がSQL

ファーストの機能をサポートしていますCASE ...でこのクエリを実行するWHEN? –

+0

あなたは 'registerTempTable'を使ってデータフレームを一時テーブルとして登録することができ、@T.Gawędaが示唆するようにSQLクエリのCASE ... WHENステートメントを使用することができます。 –

+0

うまくいくはずです。しかし、より型式の高いscala-spark-dataframe apiにとどまることは可能ですか? –

答えて

2

ただ、両方のケースのためにcountを使用します。

df.select(count($"id"), count(when($"column1" === 1, true))) 

列である場合nullableあなたは(所望の出力に応じて、​​3210またはIS NULLと例えば)そのために修正する必要があります。

0

あなたはハイブとしてハイブで火花を使用して試すことができますが

val conf = new SparkConf().setAppName("Hive_Test") 
val sc = new SparkContext(conf) 
//Creation of hive context  
val hsc = new HiveContext(sc) 

import spark.implicits._ 
import spark.sql 

hsc.sql("CREATE TABLE IF NOT EXISTS emp (id INT, name STRING)") 

hsc.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/test.txt' INTO TABLE emp") 


hsc.sql("""select count(id), SUM(v) 
from (
select id, IF(name=1, count(*), 0) AS v 
from emp 
where id>0 
group by id,name 
) t2""") 
関連する問題