Вот правильный запрос SQL:
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()
Результат:
+-------+
|country|
+-------+
| FRANCE|
| Italy|
| usa|
+-------+
Причина, по которой вы можете использовать IN/EXISTS
операторы sql только в предикатах: логика в проекциях(CASE-WHEN
в нашем случае) вычисляется для каждой строки в наборе данных, возвращаемых при выборе.Имея это в виду, не лучшая идея запускать эквивалент CASE WHEN country IN (SELECT * FROM countries)
для каждой строки из таблицы users
.Таким образом, SQL предотвращает это на уровне языка (механизм синтаксического анализа sql).