Estou procurando o equivalente SET varname = value
em SQL no Hive QL
Eu sei que posso fazer algo assim:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
Mas então recebo este erro:
caractere '@' não suportado aqui
Respostas:
Você precisa usar o hiveconf especial para substituição de variável. por exemplo
da mesma forma, você pode passar a linha de comando:
Observe que também existem variáveis env e sistema , portanto, você pode fazer referência,
${env:USER}
por exemplo.Para ver todas as variáveis disponíveis, na linha de comando, execute
ou a partir do prompt do hive, execute
Atualização: comecei a usar variáveis hivevar também, colocando-as em fragmentos hql que posso incluir da CLI do hive usando o
source
comando (ou passar como a opção -i da linha de comando). O benefício aqui é que a variável pode então ser usada com ou sem o prefixo hivevar e permitir algo semelhante ao uso global versus local.Portanto, suponha que haja algum setup.hql que defina uma variável tablename:
então, posso trazer para a colmeia:
e usar na consulta:
ou
Eu também poderia definir um tablename "local", o que afetaria o uso de $ {tablename}, mas não de $ {hivevar: tablename}
vs
Provavelmente não significa muito da CLI, mas pode ter hql em um arquivo que usa o código-fonte , mas defina algumas das variáveis "localmente" para usar no restante do script.
fonte
set CURRENT_DATE='2012-09-16';
isso, poderá consultá-lo mais tarde com${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
A maioria das respostas aqui sugeriu usar
hiveconf
ouhivevar
namespace para armazenar a variável. E todas essas respostas estão certas. No entanto, há mais um namespace.Há um total de três
namespaces
disponíveis para variáveis de retenção.Portanto, se você estiver armazenando uma variável como parte de uma consulta (ou seja, data ou número do produto), você deve usar o
hivevar
namespace e não ohiveconf
namespace.E é assim que funciona.
hiveconf ainda é o namespace padrão , portanto, se você não fornecer nenhum namespace, ele armazenará sua variável no namespace hiveconf.
No entanto, quando se trata de se referir a uma variável, isso não é verdade. Por padrão, ele se refere ao namespace hivevar . Confuso, certo? Isso pode ficar mais claro com o exemplo a seguir.
Se você não fornecer o namespace conforme mencionado abaixo, a variável
var
será armazenada nohiveconf
namespace.Então, para acessar isso, você precisa especificar o
hiveconf
namespaceE se você não fornecer o namespace , ocorrerá um erro conforme mencionado abaixo, o motivo é que, por padrão, se você tentar acessar uma variável, ele verifica
hivevar
apenas no namespace. Ehivevar
não há nenhuma variável chamadavar
Fornecemos um
hivevar
namespace explicitamentecomo estamos fornecendo o namespace, isso funcionará.
E como padrão, a área de trabalho usada durante a referência de uma variável é
hivevar
, o seguinte também funcionará.fonte
Você já tentou usar o cifrão e colchetes como este:
fonte
Duas maneiras fáceis:
Usando Hive conf
Usando hive vars
Em seu CLI, defina vars e use-os no hive
Documentação: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
fonte
Uma coisa a se ter em mente é definir strings e, em seguida, consultar de volta a eles. Você tem que ter certeza de que as aspas não estão colidindo.
Ao definir datas, em seguida, referindo-se a elas no código, pois as strings podem entrar em conflito. Isso não funcionaria com start_date definido acima.
Devemos estar atentos para não definir duas aspas simples ou duplas para strings ao fazer referência a elas na consulta.
fonte
Caso alguém precise parametrizar a consulta do hive via CLI.
Por exemplo:
hive_query.sql
Agora execute o arquivo sql acima em cli:
fonte
Experimente este método:
funciona bem na minha plataforma.
fonte
Você pode exportar a variável no script de shell export CURRENT_DATE = "2012-09-16"
Então, no hiveql, você gosta de SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}'
fonte
Você pode armazenar a saída de outra consulta em uma variável e, posteriormente, pode usar a mesma em seu código:
fonte