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
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.
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.
- 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.
- hivevar : do przechowywania zmiennych użytkownika
- 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};
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}';
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
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
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.
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.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} '
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};
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};
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