добавление подзапроса к описанию дела в улье - PullRequest
1 голос
/ 05 апреля 2019

Я надеюсь, вы можете помочь. У меня есть запрос ниже, который имеет оператор case.

Я хочу сказать:

ЕСЛИ домен находится в другой таблице, вернуть имя домена, иначе пометьте его как «прочее»

Я использую Hive и получаю ошибку:

Unsupported SubQuery Expression 'cleandomain': Currently SubQuery expressions are only allowed as Where Clause predicates

Есть ли другой способ добиться того же?

SELECT *,
       CASE
         WHEN cleandomain IN (SELECT cleandomain
                              FROM   keenek1.daily_top_doms) THEN cleandomain
         ELSE 'other'
       END AS status
FROM   (SELECT hour,.....

1 Ответ

1 голос
/ 05 апреля 2019

Одним из возможных решений является использование in_file (строка str, строка имени файла) function.

Поместите список доменов в текстовый файл, по одному домену в строке, в текстовый файл.Для этой цели вы можете использовать таблицу кустов, хранящуюся в виде текста, и вызывать функцию в операторе CASE:

  CASE
     WHEN in_file(cleandomain,'file/path') THEN cleandomain
     ELSE 'other'
   END AS status

Другое решение - объединить список доменов в массив в подзапросе, объединить с помощью перекрестного объединения и использовать array_contains().Это может работать намного быстрее, если список не слишком большой:

with dom as (
SELECT collect_set(cleandomain) dom
  FROM   keenek1.daily_top_doms
)

select 
case when array_contains(d.dom, s.cleardomain) then s.cleandomain
         else 'other'
 end as status
from (your query) s cross join dom d --one row cross join
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...