Estoy buscando el equivalente SQL de SET varname = value
en Hive QL
Sé que puedo hacer algo como esto:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
Pero luego me sale este error:
el carácter '@' no se admite aquí
Respuestas:
Necesita usar el hiveconf especial para la sustitución de variables. p.ej
de manera similar, puede pasar la línea de comando:
Tenga en cuenta que también hay variables env y system , por lo que puede hacer referencia,
${env:USER}
por ejemplo,.Para ver todas las variables disponibles, desde la línea de comando, ejecute
o desde el indicador de colmena, ejecute
Actualización: también comencé a usar variables de hivevar , poniéndolas en fragmentos de hql que puedo incluir desde la CLI de hive usando el
source
comando (o pasar como opción -i desde la línea de comando). El beneficio aquí es que la variable se puede usar con o sin el prefijo hivevar, y permitir algo similar al uso global vs local.Entonces, suponga que tiene setup.hql que establece una variable de nombre de tabla:
entonces, puedo traer a la colmena:
y usar en la consulta:
o
También podría establecer un nombre de tabla "local", que afectaría el uso de $ {nombre de tabla}, pero no $ {hivevar: nombre de tabla}
vs
Probablemente no signifique mucho de la CLI, pero puede tener hql en un archivo que usa fuente , pero establezca algunas de las variables "localmente" para usar en el resto del script.
fuente
set CURRENT_DATE='2012-09-16';
, puede consultarlo más tarde con${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
La mayoría de las respuestas aquí han sugerido usar
hiveconf
o elhivevar
espacio de nombres para almacenar la variable. Y todas esas respuestas son correctas. Sin embargo, hay un espacio de nombres más.Hay un total de tres
namespaces
disponibles para mantener variables.Entonces, si está almacenando una variable como parte de una consulta (es decir, fecha o número de producto), debe usar el
hivevar
espacio de nombres y no elhiveconf
espacio de nombres.Y así es como funciona.
hiveconf sigue siendo el espacio de nombres predeterminado , por lo que si no proporciona ningún espacio de nombres, almacenará su variable en el espacio de nombres hiveconf.
Sin embargo, cuando se trata de referir una variable, no es cierto. De forma predeterminada, se refiere al espacio de nombres hivevar . Confuso, ¿verdad? Puede resultar más claro con el siguiente ejemplo.
Si no proporciona el espacio de nombres como se menciona a continuación, la variable
var
se almacenará en elhiveconf
espacio de nombres.Entonces, para acceder a esto, debe especificar el
hiveconf
espacio de nombresY si no proporciona un espacio de nombres , le dará un error como se menciona a continuación, por lo que, de forma predeterminada, si intenta acceder a una variable, solo verifica el
hivevar
espacio de nombres. Yhivevar
no hay una variable nombradavar
Hemos proporcionado explícitamente un
hivevar
espacio de nombresya que estamos proporcionando el espacio de nombres, esto funcionará.
Y de forma predeterminada, el espacio de trabajo utilizado durante la referencia de una variable es
hivevar
el siguiente también funcionará.fuente
¿Ha intentado usar el signo de dólar y corchetes como este?
fuente
Dos formas sencillas:
Usando Hive Conf
Usando vars de colmena
En su CLI, configure vars y luego utilícelas en Hive
Documentación: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
fuente
Una cosa a tener en cuenta es establecer cadenas y luego referirse a ellas. Debe asegurarse de que las comillas no colisionen.
Al establecer fechas, refiérase a ellas en el código ya que las cadenas pueden entrar en conflicto. Esto no funcionaría con la fecha de inicio establecida anteriormente.
Debemos tener cuidado de no establecer dos comillas simples o dobles para las cadenas cuando se hace referencia a ellas en la consulta.
fuente
En caso de que alguien necesite parametrizar la consulta de colmena a través de cli.
Por ejemplo:
hive_query.sql
Ahora ejecute el archivo sql anterior desde cli:
fuente
Prueba este método:
funciona bien en mi plataforma.
fuente
Puede exportar la variable en el script de shell export CURRENT_DATE = "2012-09-16"
Luego, en hiveql te gusta SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}'
fuente
Puede almacenar la salida de otra consulta en una variable y luego puede usar la misma en su código:
fuente