web-dev-qa-db-fra.com

SparkSQL prend-il en charge les sous-requêtes?

J'exécute cette requête dans Spark Shell mais cela me donne une erreur,

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

erreur:

Java.lang.RuntimeException: [1.47] échec: ``) '' attendu mais l'identifiant MAX trouvé

sélectionnez sal dans samplecsv où sal <(sélectionnez MAX (sal) dans samplecsv) ^ at scala.sys.package $ .error (package.scala: 27) Quelqu'un peut-il m'expliquer, merci

13
Rinku Buragohain

Fonctionnalités prévues:

  • SPARK-23945 (Column.isin () doit accepter un DataFrame à colonne unique en tant qu'entrée).
  • SPARK-18455 (Prise en charge générale du traitement de sous-requête corrélée).

Spark 2.0+

Spark SQL doit prendre en charge les sous-requêtes corrélées et non corrélées. Voir SubquerySuite pour plus de détails. Quelques exemples incluent:

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)

Malheureusement, comme pour l'instant (Spark 2.0), il est impossible d'exprimer la même logique à l'aide de DataFrame DSL.

Spark <2.0

Spark prend en charge les sous-requêtes de la clause FROM (identique à Hive <= 0.12). 

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

Elle ne prend tout simplement pas en charge les sous-requêtes de la clause WHERE. De manière générale, les sous-requêtes arbitraires (en particulier les sous-requêtes corrélées) ne peuvent pas être exprimées à l'aide de Spark sans passer à la jonction cartésienne.

Étant donné que les performances des sous-requêtes constituent généralement un problème important dans un système relationnel typique et que chaque sous-requête peut être exprimée à l'aide de JOIN, il n'y a pas de perte de fonction ici.

33
zero323

https://issues.Apache.org/jira/browse/SPARK-4226

Il existe une demande d'extraction pour implémenter cette fonctionnalité. Je suppose que cela pourrait atterrir dans Spark 2.0.

0
Tagar