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};