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
Fonctionnalités prévues:
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.
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.