Почему Spark Analyzer сообщает «Связанные скалярные подзапросы должны быть агрегированы» в случае? - PullRequest
0 голосов
/ 24 апреля 2018

Тест, использующий spark-sql, не выполнен из-за следующей ошибки:

Коррелированные скалярные подзапросы должны быть агрегированы

Соответствующая часть SQL-запроса, которая не выполняется:

COALESCE(
    CASE WHEN ndc_code IN 
    (SELECT CODE FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc')
      THEN '180'
    END,
    CASE WHEN hcpcs_code IN 
    (SELECT CODE FROM BOC_MED_METADATA WHERE CODE_TYPE = 'hcpcs')
      THEN '180'
    END,
    med_order_end_dttm,
    CASE WHEN days_supply IS NOT NULL
      THEN
        CASE
          WHEN discontinued AND (med_order_recorded_dttm BETWEEN medication_start AND start_plus)
            THEN med_order_recorded_dttm
          WHEN discontinued AND (med_order_recorded_dttm > start_plus)
            THEN start_plus
          WHEN NOT discontinued
            THEN start_plus
        END
    END,
    medication_start
  )

Первые два cases в coalesce - это то, что я добавил и вызвало сбой теста. Я считаю, что это из-за того, как подзапросы будут возвращать несколько строк, но я не уверен, как обойти это. Любая помощь приветствуется. Если это имеет значение, то этот SQL запускается только для испытаний, на самом деле он работает на складе снежинок в производстве.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Вместо использования IN используйте EXISTS в первых двух операторах CASE.Попробуйте это:

COALESCE(
    CASE WHEN EXISTS( SELECT 1 FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc' AND CODE = ndc_code) 
      THEN '180'
    END,
    CASE WHEN EXISTS( SELECT 1 FROM BOC_MED_METADATA WHERE CODE_TYPE = 'hcpcs' AND CODE = hcpcs_code)
      THEN '180'
    END,
    med_order_end_dttm,
    CASE WHEN days_supply IS NOT NULL
      THEN
        CASE
          WHEN discontinued AND (med_order_recorded_dttm BETWEEN medication_start AND start_plus)
            THEN med_order_recorded_dttm
          WHEN discontinued AND (med_order_recorded_dttm > start_plus)
            THEN start_plus
          WHEN NOT discontinued
            THEN start_plus
        END
    END,
    medication_start
  )

Если вышеописанное не помогло, попробуйте указать ndc_code и hcpcs_code с именем таблицы.

0 голосов
/ 28 мая 2018

Я смущен, когда вижу ошибку, так как не понимаю, как подзапросы можно было бы считать коррелированными. С чем они соотносятся?

В любом случае, чтобы избавиться от ошибки (которая, как мне кажется, происходит во время анализа, то есть до выполнения запроса), нужно использовать любую стандартную статистическую функцию, которая гарантирует Spark Analyzer, что запросы возвращают только одну строку с одним столбец или строка вообще отсутствует (в результате получится null).

Вы можете использовать first или max стандартные агрегатные функции следующим образом:

SELECT first(CODE) FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc'

Я не думаю, что Spark должен сообщать об исключении, поскольку я не могу найти никаких коррелированных запросов, и использование SQL IN должно действительно принимать любое количество значений из подзапроса. Я в замешательстве.

0 голосов
/ 24 апреля 2018

Если этот код:

CASE WHEN ndc_code IN 
              (SELECT CODE FROM BOC_MED_METADATA WHERE CODE_TYPE = 'ndc')
     THEN '180'

Генерирует ошибку вида

Коррелированные скалярные подзапросы должны быть агрегированы

И ошибкасообщение является точным, то в таблице отсутствует CODE или CODETYPE.Итак, моя первая рекомендация - указать все имена столбцов:

CASE WHEN ndc_code IN 
              (SELECT bmm.CODE FROM BOC_MED_METADATA bmm WHERE bmm.CODE_TYPE = 'ndc')
     THEN '180'

Это должно вернуть сообщение об ошибке, что один или другой столбец не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...