Mam wstawić dane do tabeli docelowej, gdzie wszystkie kolumny powinny być wypełnione z różnych tabel źródłowych, z wyjątkiem kolumny klucza zastępczego; która powinna być maksymalną wartością tabeli docelowej plus wartość auto increment począwszy od 1. Potrafię wygenerować wartość auto increment za pomocą funkcji row_number(), ale w tym samym zapytaniu w jaki sposób powinienem uzyskać maksymalną wartość klucza zastępczego z tabeli docelowej. Czy w HIVE jest jakaś koncepcja, w której mogę wybrać maksymalną wartość zastępczego klucza i zapisać ją w zmiennej tymczasowej? Czy jest jakiś inny prosty sposób na osiągnięcie tego wyniku?hive auto increment po pewnym numerze
Odpowiedz
Oto dwa podejścia, które pomogły mi rozwiązać powyższy problem. (Jak opisano w przykładzie)
Sposób 1: uzyskanie maksymalnej i ustawienie ula poleceń poprzez $ {hiveconf} zmienna za pomocą skrypt
Sposób 2: pomocą row_sequence(), max() i połączyć operacje
Moja Środowisko:
hadoop-2.6.0
apache-hive-2.0.0-bin
St eps: (uwaga: krok 1 i krok 2 są wspólne dla obu podejść. Zaczynając od kroku 3, różni się zarówno)
Etap 1: tworzyć źródłowy i docelowy tabele
źródło
hive>create table source_table1(string name);
hive>create table source_table2(string name);
hive>create table source_table2(string name);
cel
hive>create table target_table(int id,string name);
Krok 2: ładowania danych do tabel źródłowych
hive>load data local inpath 'source_table1.txt' into table source_table1;
hive>load data local inpath 'source_table2.txt' into table source_table2;
hive>load data local inpath 'source_table3.txt' into table source_table3;
próbki wejściowej:
source_table1.txt
a
b
c
source_table2.txt
d
e
f
source_table3.txt
g
h
i
Sposób 1:
Etap 3: utworzyć hive_auto_increment skryptu powłoki.sh
#!/bin/sh
hive -e 'select max(id) from target_table' > max.txt
wait
value=`cat max.txt`
hive --hiveconf mx=$value -e "add jar /home/apache-hive-2.0.0-bin/lib/hive-contrib-2.0.0.jar;
create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';
set mx;
set hiveconf:mx;
INSERT INTO TABLE target_table SELECT row_sequence(),name from source_table1;
INSERT INTO TABLE target_table SELECT (\${hiveconf:mx} +row_sequence()),name from source_table2;
INSERT INTO TABLE target_table SELECT (\${hiveconf:mx} +row_sequence()),name from source_table3;"
wait
hive -e "select * from target_table;"
Krok 4: uruchomić skrypt powłoki
> bash hive_auto_increment.sh
Podejście 2:
Krok 3: Dodaj Jar
hive>add jar /home/apache-hive-2.0.0-bin/lib/hive-contrib-2.0.0.jar;
Etap 4: rejestr funkcja row_sequence przy pomocy ula contrib słoiku
hive>create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';
Etap 5: załadowania source_table1 do target_table
hive>INSERT INTO TABLE target_table select row_sequence(),name from source_table1;
Etap 6: obciążenia z innych źródeł target_table
hive>INSERT INTO TABLE target_table SELECT M.rowcount+row_sequence(),T.name from source_table2 T join (select max(id) as rowcount from target_table) M;
hive>INSERT INTO TABLE target_table SELECT M.rowcount+row_sequence(),T.name from source_table3 T join (select max(id) as rowcount from target_table) M;
moc wyjściowa:
Dzięki za wyszukaną odpowiedź. Czy możesz powiedzieć, co możemy zrobić w sytuacji, gdy rekordy są wstawiane do tabeli docelowej z wielu zadań jednocześnie? – Marco99