Как использовать переменную списка SET в операторе CASE в HIVE - PullRequest
0 голосов
/ 05 декабря 2018

Я сталкиваюсь с проблемой, когда я устанавливаю список значений в переменную, а затем хочу использовать этот список в своем операторе CASE в операторе SELECT, но по какой-то причине я продолжаю получать ошибку.

Ошибка при компиляции оператора: FAILED: строка ParseException 3:38 не может распознать ввод вблизи 'IN' 'THEN' '' C '' в спецификации выражения

Например

SET close=('a','b','c');
SET open=('x','y','z');
SELECT *,
      CASE 
      WHEN test IN ${close} then 'c'
      WHEN test IN ${open} then 'o' 
      END as case
FROM t1

Мне интересно, возможно ли вообще использовать эту логику в запросе HIVE.

Любая помощь будет приветствоваться.

1 Ответ

0 голосов
/ 05 декабря 2018

вы определяете переменную правильным образом, однако они, на которые мы ссылаемся, неверны, и поэтому ошибка.вам нужно ссылаться на переменную, используя ${hiveconf:vairable_name}

попробуйте это

SET close=('a','b','c');
SET open=('x','y','z');
SELECT *,
      CASE 
      WHEN test IN ${hiveconf:close} then 'c'
      WHEN test IN ${hiveconf:open} then 'o' 
      END as case
FROM t1

Длинное объяснение:

Всего доступно три namespaces дляпеременные

  1. hiveconf - куст начался с этого, вся конфигурация улья сохраняется как часть этого конф.изначально подстановка переменных не была частью улья, и когда она появилась, все пользовательские переменные также были сохранены как часть этого.Что, безусловно, не очень хорошая идея.Таким образом, созданы еще два пространства имен.
  2. hivevar : для хранения пользовательских переменных
  3. system : для хранения системных переменных.

И вот как это работает.

hiveconf по-прежнему пространство имен по умолчанию , так что если выне предоставляйте никакого пространства имен, оно будет хранить вашу переменную в пространстве имен hiveconf.

Однако, когда речь идет о ссылке на переменную, это не так.По умолчанию это относится к пространству имен hivevar .сбивает с толку, верно?это было бы более понятно из следующего примера.

пространство имен не предусмотрено, переменная var будет сохранена в hiveconf пространстве имен.

set var="default_namespace";

Это будет работать, как вы указали hiveconf пространство имен

select ${hiveconf:var};

Это даст вам ошибку, так как если пространство имен не предоставлено, оно проверяет hivevar пространство имен.И в hivevar нет переменной с именем var

select ${var}; 

, которую мы явно предоставили hivevar namespace

set hivevar:var="hivevar_namespace";

, поскольку мы предоставляем пространство имен, это будет работать.

select ${hivevar:var}; 

И, поскольку рабочее пространство по умолчанию, используемое при обновлении переменной, равно hivevar, будет работать и следующее.

select ${var};
...