2015-11-26 28 views
10

Sto facendo funzionare questa query in guscio Spark ma mi dà errore,SparkSQL supporta la sottoquery?

sqlContext.sql(
"select sal from samplecsv where sal < (select MAX(sal) from samplecsv)" 
).collect().foreach(println) 

errore:

java.lang.RuntimeException: [1.47] failure: ``)'' expected but identifier MAX found

select sal from samplecsv where sal < (select MAX(sal) from samplecsv) ^ at scala.sys.package$.error(package.scala:27) Can anybody explan me,thanks

risposta

28

Spark 2.0+

Spark SQL dovrebbe sostenere sia Sottointerrogazioni correlate e non correlate . Vedi SubquerySuite per i dettagli. Alcuni esempi includono:

select * from l where exists (select * from r where l.a = r.c) 
select * from l where not exists (select * from r where l.a = r.c) 

select * from l where l.a in (select c from r) 
select * from l where a not in (select c from r) 

Purtroppo come per ora (Spark 2.0) non è possibile esprimere la stessa logica con DataFrame DSL.

Spark < 2,0

Spark supporta subquery nella clausola FROM (stessi come Hive < = 0,12).

SELECT col FROM (SELECT * FROM t1 WHERE bar) t2 

Semplicemente non supporta subquery nella WHERE clause.Generally lingua subqueries arbitrarie (in particolare subquery correlate) non potrebbe essere espressa Spark senza promuovere a cartesiana.

Poiché le prestazioni delle subquery sono di solito un problema significativo in un tipico sistema relazionale e ogni subquery può essere espressa utilizzando JOIN qui non c'è alcuna perdita di funzione qui.