вы определяете переменную правильным образом, однако они, на которые мы ссылаемся, неверны, и поэтому ошибка.вам нужно ссылаться на переменную, используя ${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
дляпеременные
- hiveconf - куст начался с этого, вся конфигурация улья сохраняется как часть этого конф.изначально подстановка переменных не была частью улья, и когда она появилась, все пользовательские переменные также были сохранены как часть этого.Что, безусловно, не очень хорошая идея.Таким образом, созданы еще два пространства имен.
- hivevar : для хранения пользовательских переменных
- 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};