Come impostare le variabili negli script HIVE

Sto cercando l’equivalente SQL di “SET varname = value” in Hive QL

So che posso fare qualcosa del genere:

SET CURRENT_DATE = '2012-09-16'; SELECT * FROM foo WHERE day >= @CURRENT_DATE 

Ma poi ricevo questo errore “carattere ‘@’ non supportato qui”

È necessario utilizzare lo speciale hiveconf per la sostituzione delle variabili. per esempio

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

allo stesso modo, è ansible passare alla riga di comando:

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

Nota che esistono anche le variabili di sistema e di env , quindi puoi fare riferimento a ${env:USER} ad esempio.

Per vedere tutte le variabili disponibili, dalla riga di comando, eseguire

 % hive -e 'set;' 

o dal prompt dell’hive, eseguire

 hive> set; 

Aggiornamento: ho iniziato a usare anche le variabili hivevar , inserendole in frammenti di codice hql che posso includere dalla CLI di hive usando il comando source (o passare come opzione -i dalla riga di comando). Il vantaggio qui è che la variabile può quindi essere utilizzata con o senza il prefisso hivevar e consentire qualcosa di simile all’utilizzo globale o locale.

Quindi, supponiamo di avere qualche setup.hql che imposta una variabile tablename:

 set hivevar:tablename=mytable; 

quindi, posso portare nell’hive:

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

e utilizzare nella query:

 hive> select * from ${tablename} 

o

 hive> select * from ${hivevar:tablename} 

Potrei anche impostare un tablename “locale”, che influirebbe sull’uso di $ {tablename}, ma non su $ {hivevar: tablename}

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

vs

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

Probabilmente non significa troppo dalla CLI, ma può avere hql in un file che usa la sorgente , ma impostare alcune delle variabili “localmente” da usare nel resto dello script.

Hai provato a usare il simbolo del dollaro e le parentesi in questo modo:

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

Prova questo metodo:

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

funziona bene sulla mia piattaforma.

È ansible memorizzare l’output di un’altra query in una variabile e quest’ultimo è ansible utilizzare lo stesso nel codice:

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