Cómo establecer variables en scripts HIVE

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 aparece este error “character ‘@’ no soportado aquí”

Debe usar el hive especial para sustitución de variables. p.ej

 hive> set CURRENT_DATE='2012-09-16'; hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}' 

de manera similar, puede pasar la línea de comando:

 % hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql 

Tenga en cuenta que también existen variables env y system , por lo que puede hacer referencia a ${env:USER} por ejemplo.

Para ver todas las variables disponibles, desde la línea de comando, ejecuta

 % hive -e 'set;' 

o desde el aviso de la hive, ejecuta

 hive> set; 

Actualización: también he comenzado a usar variables de hivevar , poniéndolas en fragmentos de hql que puedo incluir desde hive CLI usando el comando de source (o paso como -i desde la línea de comando). El beneficio aquí es que la variable puede usarse con o sin el prefijo hivevar, y permitir algo similar al uso global versus local.

Por lo tanto, supongamos que tiene algún setup.hql que establece una variable de nombre de tabla:

 set hivevar:tablename=mytable; 

entonces, puedo traer a la hive:

 hive> source /path/to/setup.hql; 

y usar en consulta:

 hive> select * from ${tablename} 

o

 hive> select * from ${hivevar:tablename} 

También podría establecer un nombre de tabla “local”, que afectaría el uso de $ {tablename}, pero no $ {hivevar: tablename}

 hive> set tablename=newtable; hive> select * from ${tablename} -- uses 'newtable' 

vs

 hive> select * from ${hivevar:tablename} -- still uses the original 'mytable' 

Probablemente no signifique demasiado de la CLI, pero puede tener hql en un archivo que use fuente , pero establezca algunas de las variables “localmente” para usar en el rest de la secuencia de comandos.

¿Has intentado usar el signo de dólar y los corchetes de esta manera?

 SELECT * FROM foo WHERE day >= '${CURRENT_DATE}'; 

Prueba este método:

 set t=20; select * from myTable where age > '${hiveconf:t}'; 

funciona bien en mi plataforma.

Puede almacenar el resultado de otra consulta en una variable y luego puede usar la misma en su código:

 set var=select count(*) from My_table; ${hiveconf:var};