Запрос Spark SQL с оператором IN в случае, когда не может быть приведен к SparkPlan - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь выполнить тестовый запрос следующим образом:

SELECT COUNT(CASE WHEN name IN (SELECT name FROM requiredProducts) THEN name END)
FROM myProducts

, который выдает следующее исключение:

java.lang.ClassCastException:
org.apache.spark.sql.execution.datasources.LogicalRelation cannot be cast to
org.apache.spark.sql.execution.SparkPlan

У меня есть предположение, что оператор IN нельзя использовать в CASE WHEN . Это действительно так? В документации Spark об этом ничего не говорится.

1 Ответ

2 голосов
/ 12 апреля 2019

Оператор IN , использующий подзапрос, не работает в проекции, независимо от того, содержится ли он в CASE WHEN , он будет работать только в фильтрах.Это работает нормально, если вы указываете значения в предложении IN напрямую, а не используете подзапрос.

Я не уверен, как сгенерировать точное исключение, которое вы получили выше, но когда я пытаюсь запуститьПодобный запрос в Spark Scala возвращает более описательную ошибку:

org.apache.spark.sql.AnalysisException: IN/EXISTS predicate sub-queries can only be used in a Filter: Project [CASE WHEN agi_label#5 IN (list#96 []) THEN 1 ELSE 0 END AS CASE WHEN (agi_label IN (listquery())) THEN 1 ELSE 0 END#97]

Я сталкивался с этой проблемой в прошлом.Лучше всего, вероятно, реструктурировать его, чтобы использовать левое соединение с requiredProducts, а затем проверить нулевое значение в выписке.Например, что-то вроде этого может работать:

SELECT COUNT(CASE WHEN rp.name is not null THEN mp.name END)
FROM myProducts mp 
  LEFT JOIN requiredProducts rp ON mp.name = rp.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...