Spark IN/EXISTS predicate in SELECT statement
up vote
0
down vote
favorite
I have the following Spark SQL test query:
Seq("france").toDF.createOrReplaceTempView("countries")
SELECT CASE WHEN country = 'italy' THEN 'Italy'
ELSE ( CASE WHEN country IN (FROM countries) THEN upperCase(country) ELSE country END )
END AS country FROM users
which throws the following error:
Exception in thread "main" org.apache.spark.sql.AnalysisException:
IN/EXISTS predicate sub-queries can only be used in a Filter
the following part of the query CASE WHEN country IN (FROM countries)
is the reason for that.
Is there any workaround in Spark SQL exists in order to emulate country IN (FROM countries)
in the select conditions? I interested in pure SQL implementation and not in the implementation via API.
apache-spark apache-spark-sql
add a comment |
up vote
0
down vote
favorite
I have the following Spark SQL test query:
Seq("france").toDF.createOrReplaceTempView("countries")
SELECT CASE WHEN country = 'italy' THEN 'Italy'
ELSE ( CASE WHEN country IN (FROM countries) THEN upperCase(country) ELSE country END )
END AS country FROM users
which throws the following error:
Exception in thread "main" org.apache.spark.sql.AnalysisException:
IN/EXISTS predicate sub-queries can only be used in a Filter
the following part of the query CASE WHEN country IN (FROM countries)
is the reason for that.
Is there any workaround in Spark SQL exists in order to emulate country IN (FROM countries)
in the select conditions? I interested in pure SQL implementation and not in the implementation via API.
apache-spark apache-spark-sql
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have the following Spark SQL test query:
Seq("france").toDF.createOrReplaceTempView("countries")
SELECT CASE WHEN country = 'italy' THEN 'Italy'
ELSE ( CASE WHEN country IN (FROM countries) THEN upperCase(country) ELSE country END )
END AS country FROM users
which throws the following error:
Exception in thread "main" org.apache.spark.sql.AnalysisException:
IN/EXISTS predicate sub-queries can only be used in a Filter
the following part of the query CASE WHEN country IN (FROM countries)
is the reason for that.
Is there any workaround in Spark SQL exists in order to emulate country IN (FROM countries)
in the select conditions? I interested in pure SQL implementation and not in the implementation via API.
apache-spark apache-spark-sql
I have the following Spark SQL test query:
Seq("france").toDF.createOrReplaceTempView("countries")
SELECT CASE WHEN country = 'italy' THEN 'Italy'
ELSE ( CASE WHEN country IN (FROM countries) THEN upperCase(country) ELSE country END )
END AS country FROM users
which throws the following error:
Exception in thread "main" org.apache.spark.sql.AnalysisException:
IN/EXISTS predicate sub-queries can only be used in a Filter
the following part of the query CASE WHEN country IN (FROM countries)
is the reason for that.
Is there any workaround in Spark SQL exists in order to emulate country IN (FROM countries)
in the select conditions? I interested in pure SQL implementation and not in the implementation via API.
apache-spark apache-spark-sql
apache-spark apache-spark-sql
edited 2 days ago
asked 2 days ago


alexanoid
6,8831175166
6,8831175166
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
1
down vote
accepted
Here's the correct SQL query:
import sparkSession.implicits._
Seq("france").toDF("country").createOrReplaceTempView("countries")
Seq(("user1", "france"), ("user2", "italy"), ("user2", "usa"))
.toDF("user", "country").createOrReplaceTempView("users")
val query =
s"""
|SELECT
| CASE
| WHEN u.country = 'italy' THEN 'Italy'
| ELSE (
| CASE
| WHEN u.country = c.country THEN upper(u.country)
| ELSE u.country
| END
| ) END AS country
|FROM users u
|LEFT JOIN countries c
| ON u.country = c.country
""".stripMargin
sparkSession.sql(query).show()
Result:
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+
The reason behind the scene you can use IN/EXISTS
sql operators only in predicates is: logic in projections (CASE-WHEN
in our case) evaluated for each row in data set returned from selection.
With this in mind, it's not the best idea to run equivalent of CASE WHEN country IN (SELECT * FROM countries)
for each row from users
table. So, SQL prevents this on language level (sql parser engine).
add a comment |
up vote
0
down vote
As an alternative you can use
withColumn()
and
when()
function (from spark.sql.functions):
val users = Seq(("1", "france"), ("2", "Italy"), ("3", "italy")).toDF("userId", "country")
val countriesList = Seq("france", "italy", "germany").toList
val result = users.withColumn("country", when(col("country") === "italy", "Italy")
.when(col("country") isin(countriesList:_*), upper(col("country"))).otherwise(col("country")))
result.show()
Result:
+------+-------+
|userId|country|
+------+-------+
| 1| FRANCE|
| 2| Italy|
| 3| Italy|
+------+-------+
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
Here's the correct SQL query:
import sparkSession.implicits._
Seq("france").toDF("country").createOrReplaceTempView("countries")
Seq(("user1", "france"), ("user2", "italy"), ("user2", "usa"))
.toDF("user", "country").createOrReplaceTempView("users")
val query =
s"""
|SELECT
| CASE
| WHEN u.country = 'italy' THEN 'Italy'
| ELSE (
| CASE
| WHEN u.country = c.country THEN upper(u.country)
| ELSE u.country
| END
| ) END AS country
|FROM users u
|LEFT JOIN countries c
| ON u.country = c.country
""".stripMargin
sparkSession.sql(query).show()
Result:
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+
The reason behind the scene you can use IN/EXISTS
sql operators only in predicates is: logic in projections (CASE-WHEN
in our case) evaluated for each row in data set returned from selection.
With this in mind, it's not the best idea to run equivalent of CASE WHEN country IN (SELECT * FROM countries)
for each row from users
table. So, SQL prevents this on language level (sql parser engine).
add a comment |
up vote
1
down vote
accepted
Here's the correct SQL query:
import sparkSession.implicits._
Seq("france").toDF("country").createOrReplaceTempView("countries")
Seq(("user1", "france"), ("user2", "italy"), ("user2", "usa"))
.toDF("user", "country").createOrReplaceTempView("users")
val query =
s"""
|SELECT
| CASE
| WHEN u.country = 'italy' THEN 'Italy'
| ELSE (
| CASE
| WHEN u.country = c.country THEN upper(u.country)
| ELSE u.country
| END
| ) END AS country
|FROM users u
|LEFT JOIN countries c
| ON u.country = c.country
""".stripMargin
sparkSession.sql(query).show()
Result:
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+
The reason behind the scene you can use IN/EXISTS
sql operators only in predicates is: logic in projections (CASE-WHEN
in our case) evaluated for each row in data set returned from selection.
With this in mind, it's not the best idea to run equivalent of CASE WHEN country IN (SELECT * FROM countries)
for each row from users
table. So, SQL prevents this on language level (sql parser engine).
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
Here's the correct SQL query:
import sparkSession.implicits._
Seq("france").toDF("country").createOrReplaceTempView("countries")
Seq(("user1", "france"), ("user2", "italy"), ("user2", "usa"))
.toDF("user", "country").createOrReplaceTempView("users")
val query =
s"""
|SELECT
| CASE
| WHEN u.country = 'italy' THEN 'Italy'
| ELSE (
| CASE
| WHEN u.country = c.country THEN upper(u.country)
| ELSE u.country
| END
| ) END AS country
|FROM users u
|LEFT JOIN countries c
| ON u.country = c.country
""".stripMargin
sparkSession.sql(query).show()
Result:
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+
The reason behind the scene you can use IN/EXISTS
sql operators only in predicates is: logic in projections (CASE-WHEN
in our case) evaluated for each row in data set returned from selection.
With this in mind, it's not the best idea to run equivalent of CASE WHEN country IN (SELECT * FROM countries)
for each row from users
table. So, SQL prevents this on language level (sql parser engine).
Here's the correct SQL query:
import sparkSession.implicits._
Seq("france").toDF("country").createOrReplaceTempView("countries")
Seq(("user1", "france"), ("user2", "italy"), ("user2", "usa"))
.toDF("user", "country").createOrReplaceTempView("users")
val query =
s"""
|SELECT
| CASE
| WHEN u.country = 'italy' THEN 'Italy'
| ELSE (
| CASE
| WHEN u.country = c.country THEN upper(u.country)
| ELSE u.country
| END
| ) END AS country
|FROM users u
|LEFT JOIN countries c
| ON u.country = c.country
""".stripMargin
sparkSession.sql(query).show()
Result:
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+
The reason behind the scene you can use IN/EXISTS
sql operators only in predicates is: logic in projections (CASE-WHEN
in our case) evaluated for each row in data set returned from selection.
With this in mind, it's not the best idea to run equivalent of CASE WHEN country IN (SELECT * FROM countries)
for each row from users
table. So, SQL prevents this on language level (sql parser engine).
answered yesterday


morsik
684815
684815
add a comment |
add a comment |
up vote
0
down vote
As an alternative you can use
withColumn()
and
when()
function (from spark.sql.functions):
val users = Seq(("1", "france"), ("2", "Italy"), ("3", "italy")).toDF("userId", "country")
val countriesList = Seq("france", "italy", "germany").toList
val result = users.withColumn("country", when(col("country") === "italy", "Italy")
.when(col("country") isin(countriesList:_*), upper(col("country"))).otherwise(col("country")))
result.show()
Result:
+------+-------+
|userId|country|
+------+-------+
| 1| FRANCE|
| 2| Italy|
| 3| Italy|
+------+-------+
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
add a comment |
up vote
0
down vote
As an alternative you can use
withColumn()
and
when()
function (from spark.sql.functions):
val users = Seq(("1", "france"), ("2", "Italy"), ("3", "italy")).toDF("userId", "country")
val countriesList = Seq("france", "italy", "germany").toList
val result = users.withColumn("country", when(col("country") === "italy", "Italy")
.when(col("country") isin(countriesList:_*), upper(col("country"))).otherwise(col("country")))
result.show()
Result:
+------+-------+
|userId|country|
+------+-------+
| 1| FRANCE|
| 2| Italy|
| 3| Italy|
+------+-------+
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
add a comment |
up vote
0
down vote
up vote
0
down vote
As an alternative you can use
withColumn()
and
when()
function (from spark.sql.functions):
val users = Seq(("1", "france"), ("2", "Italy"), ("3", "italy")).toDF("userId", "country")
val countriesList = Seq("france", "italy", "germany").toList
val result = users.withColumn("country", when(col("country") === "italy", "Italy")
.when(col("country") isin(countriesList:_*), upper(col("country"))).otherwise(col("country")))
result.show()
Result:
+------+-------+
|userId|country|
+------+-------+
| 1| FRANCE|
| 2| Italy|
| 3| Italy|
+------+-------+
As an alternative you can use
withColumn()
and
when()
function (from spark.sql.functions):
val users = Seq(("1", "france"), ("2", "Italy"), ("3", "italy")).toDF("userId", "country")
val countriesList = Seq("france", "italy", "germany").toList
val result = users.withColumn("country", when(col("country") === "italy", "Italy")
.when(col("country") isin(countriesList:_*), upper(col("country"))).otherwise(col("country")))
result.show()
Result:
+------+-------+
|userId|country|
+------+-------+
| 1| FRANCE|
| 2| Italy|
| 3| Italy|
+------+-------+
answered 2 days ago
RudyVerboven
403414
403414
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
add a comment |
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
Thanks for your answer. Right now I'm mostly interested in pure SQL implementation.
– alexanoid
2 days ago
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53373091%2fspark-in-exists-predicate-in-select-statement%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown