Jak ustawic zmienne w skryptach HIVE

Szukam odpowiednika SQL SET varname = value w Hive QL

Wiem, że mogę zrobić coś takiego:

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

Ale wtedy dostaję ten błąd:

Znak ' @ ' nie jest tutaj obsługiwany

 104
Author: Lukas Würzburger, 2012-09-17

10 answers

Musisz użyć specjalnego hiveconf do zamiany zmiennych. np.

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

Podobnie można przekazać w wierszu poleceń:

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

Zauważ, że istnieją również zmienne env i system , więc możesz odwołać się na przykład do ${env:USER}.

Aby zobaczyć wszystkie dostępne zmienne, z linii poleceń uruchom

% hive -e 'set;'

Lub z podpowiedzi ula, Uruchom

hive> set;

Aktualizacja: Zacząłem używać zmiennych hivevar ponadto, umieszczając je w HQL urywki mogę dołączyć z hive CLI za pomocą polecenia source (lub przekazać opcję as-i z linii poleceń). Zaletą jest to, że zmienna może być używana z prefiksem hivevar lub bez niego, i pozwolić na coś podobnego do użytku globalnego vs lokalnego.

Więc załóżmy, że masz jakąś konfigurację.hql , który ustawia zmienną tablename:

set hivevar:tablename=mytable;

Wtedy mogę wprowadzić do Ulu:

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

I użyj w zapytaniu:

hive> select * from ${tablename}

Lub

hive> select * from ${hivevar:tablename}

I could also Ustaw "lokalną" nazwę tablename, która wpłynie na użycie ${tablename}, ale nie ${hivevar: tablename}

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

Vs

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

Prawdopodobnie nie oznacza zbyt wiele z CLI, ale może mieć hql w pliku, który używa źródła , ale ustawić niektóre zmienne "lokalnie" do użycia w pozostałej części skryptu.

 205
Author: libjack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-24 02:40:10

Większość odpowiedzi sugerowała użycie przestrzeni nazw hiveconf lub hivevar do przechowywania zmiennej. I wszystkie te odpowiedzi są słuszne. Jest jednak jeszcze jedna przestrzeń nazw.

Istnieją łącznie trzy namespaces dostępne do przechowywania zmiennych.

  1. hiveconf - hive zaczyna się od tego, cała konfiguracja hive jest przechowywana jako część tego konf. Początkowo zmienna substytucja nie była częścią ula i kiedy została wprowadzona, wszystkie zmienne zdefiniowane przez użytkownika były również przechowywane jako część tego. Co zdecydowanie nie jest dobrym pomysłem. Powstały więc jeszcze dwie przestrzenie nazw.
  2. hivevar : do przechowywania zmiennych użytkownika
  3. system : do przechowywania zmiennych systemowych.

I tak, jeśli przechowujesz zmienną jako część zapytania (tj. datę lub numer produktu), powinieneś użyć przestrzeni nazw hivevar, a nie przestrzeni nazw hiveconf.

I tak to działa.

Hiveconf {[23] } jest nadal domyślną przestrzenią nazw , więc jeśli nie podasz żadnej przestrzeni nazw, to twoja zmienna będzie przechowywana w przestrzeni nazw hiveconf.

Jednakże, jeśli chodzi o odwoływanie się do zmiennej, to nie jest to prawda. Domyślnie odnosi się do przestrzeni nazw hivevar. Mylące, prawda? To może stać się jaśniejsze z poniższym przykładem.

Jeśli nie podasz przestrzeni nazw Jak wspomniano poniżej, zmienna var będzie przechowywana w hiveconf przestrzeni nazw.

set var="default_namespace";

Tak więc, aby uzyskać dostęp do tego trzeba określić hiveconf przestrzeń nazw

select ${hiveconf:var};

I jeśli nie podasz przestrzeni nazw , spowoduje to błąd, jak wspomniano poniżej, ponieważ domyślnie, jeśli spróbujesz uzyskać dostęp do zmiennej, sprawdza ona tylko w hivevar przestrzeni nazw. A w {[7] } nie ma zmiennej o nazwie var

select ${var}; 

Jawnie podaliśmy hivevar przestrzeń nazw

set hivevar:var="hivevar_namespace";

Ponieważ zapewniamy przestrzeń nazw, to zadziała.

select ${hivevar:var}; 

Domyślnym obszarem roboczym używanym podczas odwoływania się do zmiennej jest hivevar.

select ${var};
 25
Author: Gaurang Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-20 22:29:48

Czy próbowałeś użyć znaku dolara i nawiasów w ten sposób:

SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';
 7
Author: YABADABADOU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 12:01:14

Dwa proste sposoby:

Using hive conf

hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';

Using hive vars

Na Twoim CLI set vars a następnie użyj ich w ulu

set hivevar:USER_NAME='FOO';

hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';

Dokumentacja: https://cwiki.apache.org/confluence/display/Hive/LanguageManual + VariableSubstitution

 3
Author: Savio D'Souza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-23 18:35:07

Na wypadek, gdyby ktoś musiał sparametryzować zapytanie hive poprzez cli.

Dla np:

Hive_query.sql

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

Teraz wykonaj powyższy plik sql z cli:

hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql
 3
Author: Abdul Mannan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-10 13:16:01

Jedną rzeczą, o której należy pamiętać, jest ustawianie ciągów, a następnie odwoływanie się do nich. Musisz się upewnić, że cytaty nie kolidują.

 set start_date = '2019-01-21';
 select ${hiveconf:start_date}; 

Gdy ustawiamy daty, odwołujemy się do nich w kodzie, ponieważ łańcuchy mogą być sprzeczne. To nie zadziała z powyższym zestawem start_date.

 '${hiveconf:start_date}'

Musimy pamiętać, aby nie ustawiać dwukrotnie pojedynczych lub podwójnych cudzysłowów dla łańcuchów podczas odwoływania się do nich w zapytaniu.

 2
Author: blondie9x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-26 01:11:58

Wypróbuj tę metodę:

set t=20;
select *
from myTable
where age > '${hiveconf:t}'; 
Działa dobrze na mojej platformie.
 0
Author: typhoonbxq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 08:02:33

Możesz wyeksportować zmienną w skrypcie powłoki export CURRENT_DATE="2012-09-16"

Wtedy w hiveql lubisz SELECT * FROM foo WHERE day > = '${ENV: CURRENT_DATE} '

 0
Author: Dileep Dominic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-10 10:47:41

Istnieje wiele opcji do Ustawienia zmiennych w Hive.

Jeśli chcesz ustawić zmienną Hive z wnętrza powłoki Hive, możesz ją ustawić za pomocą hivevar. Można ustawić typy danych typu string lub integer. Nie ma z nimi żadnych problemów.

SET hivevar:which_date=20200808;
select ${which_date};

Jeśli planujesz ustawić zmienne ze skryptu powłoki i chcesz przekazać te zmienne do pliku skryptu Hive (HQL), możesz użyć opcji --hivevar podczas wywoływania komendy hive lub beeline.

# shell script will invoke script like this
beeline --hivevar tablename=testtable -f select.hql
-- select.hql file
select * from <dbname>.${tablename};
 0
Author: Piyush Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-23 16:05:40

Możesz zapisać wyjście innego zapytania w zmiennej, a drugie możesz użyć tego samego w swoim kodzie:

set var=select count(*) from My_table;
${hiveconf:var};
 -7
Author: Suman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-07 00:19:13