2016-08-15 11 views
6

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

3

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:

+0

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