2013-07-02 7 views
37

Jestem nowy w ulu i chcę wiedzieć, czy istnieje jakakolwiek wstawka danych do tabeli ula, tak jak to robimy w SQL. Chcę wstawić swoje dane do ula jakZapytanie o wstawianie ula, takie jak SQL

INSERT INTO tablename VALUES (value1,value2..) 

Czytałem, że można wczytać dane z pliku do ula stolik lub można importować dane z jednej tabeli do ula stolik, ale czy jest jakiś sposób, aby dołączyć dane jak w SQL?

Odpowiedz

66

Niektóre odpowiedzi tutaj są nieaktualne jak ula 0,14

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingvaluesintotablesfromSQL

Jest obecnie możliwe, aby wstawić przy użyciu składni, takie jak:

CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2)); 

INSERT INTO TABLE students 
    VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32); 
+0

To naprawdę powinna być najlepsza (zaakceptowana) odpowiedź. – xenocyon

+1

@mattinbits: Próbuję wstawić wygenerowaną sekwencyjnie liczbę dla jednej kolumny i znacznik czasu dla jednej innej kolumny. Dla znacznika czasu próbowałem "from_unixtime (unix_timestamp())" w instrukcji insert. Mam "SemanticException [ERROR 10293]: Nie można utworzyć pliku tymczasowego dla wartości insert Wyrażenie typu TOK_FUNCTION nieobsługiwane we insert/values". Nie mam jasnego pojęcia, w jaki sposób mogę osiągnąć generowanie numerów sekwencyjnych. Czy mógłbyś podać kilka informacji na temat tego, w jaki sposób mogę osiągnąć oba? Używam Hive 1.1.0. Dzięki. – Marco99

+0

@ Marco99 powinieneś podnieść to nowe pytanie – mattinbits

3

Nie. Ta składnia INSERT INTO tablename VALUES (x,y,z) nie jest obecnie obsługiwana w gałęzi.

+0

czy istnieje sposób wokół tak, że mogę dołączyć dane w moim stole jak my w SQL. –

+1

'WSTAW NA nazwę pliku SELECT ...' jest obsługiwane, więc możesz umieścić nowe dane w tabeli tymczasowej, a następnie wstawić, wybierając z tego miejsca. –

+0

Chcę dodać dane w hive za pośrednictwem klienta java, będzie działać, jeśli utworzyć tymczasową tabelę danych w java i napisać kwerendę wstawiania i wybierz tylko w moim klientem java? –

1

Nie można wstawić do wstawienia pojedynczego rekordu. Nie jest obsługiwany przez Hive. Możesz umieścić wszystkie nowe rekordy, które chcesz wstawić do pliku i załadować ten plik do tabeli tymczasowej w Hive. Następnie za pomocą polecenia insert overwrite..select wstaw te wiersze do nowej partycji głównej tabeli Hive. Ograniczenie w tym przypadku to Twoja główna tabela musi być wcześniej podzielona na partycje. Jeśli nie używasz partycji, cała tabela zostanie zastąpiona nowymi rekordami.

+1

Nie do końca poprawne. "INSERT INTO będzie dołączać do tabeli lub partycji, zachowując istniejące dane w ten sposób. (Uwaga: INSERT INTO jest dostępna tylko w wersji 0.8)" https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ DML # LanguageManualDML-InsertingdataintoHiveTablesofromqueries –

0

Myślę, że w takich scenariuszach powinieneś używać HBASE, który ułatwia takie wstawianie, ale nie zapewnia żadnego języka zapytań SQL. Musisz użyć Java API z HBASE, jak metoda put, aby wprowadzić takie wstawianie. Ponadto HBASE jest kolumnową bazą danych no-sql.

5

Możesz zdecydowanie dołączyć dane do istniejącej tabeli. (Ale w rzeczywistości nie jest to dodatek na poziomie HDFS). Chodzi o to, że za każdym razem, gdy wykonasz operację ŁADUJ lub WSTAW na istniejącej tabeli Hive bez klauzuli OVERWRITE, nowe dane zostaną umieszczone bez zastępowania starych danych. Dla nowo wstawionych danych w katalogu odpowiadającym tej tabeli zostanie utworzony nowy plik. Na przykład:

Mam plik o nazwie demo.txt który ma 2 linie:

ABC 
XYZ 

utworzyć tabelę i załadować ten plik do niego

hive> create table demo(foo string); 
hive> load data inpath '/demo.txt' into table demo; 

Teraz, jeśli zrobić SELECT na tym stole będzie to dać mi:

hive> select * from demo;       
OK  
ABC  
XYZ 

Przypuśćmy, że mam jeszcze jeden plik o nazwie demo2.txt który posiada:

PQR 

I robię obciążeniem ponownie na tej tabeli bez użycia nadpisać

hive> load data inpath '/demo2.txt' into table demo; 

Teraz, jeśli mam teraz zrobić SELECT, to będzie mi dać,

hive> select * from demo;      
OK 
ABC 
XYZ 
PQR 

HTH

15

Można użyć stosu funkcji generowania tabel, aby wstawić wartości literału do tabeli.

Najpierw potrzebujesz obojętnego stołu, który zawiera tylko jedną linię. Możesz go wygenerować za pomocą limitu.

CREATE TABLE one AS 
SELECT 1 AS one 
FROM any_table_in_your_database 
LIMIT 1; 

Teraz można utworzyć nową tabelę z wartościami dosłownych tak:

CREATE TABLE my_table AS 
SELECT stack(3 
    , "row1", 1 
    , "row2", 2 
    , "row3", 3 
) AS (column1, column2) 
FROM one 
; 

Pierwszym argumentem stosu jest liczba wierszy, które generują.

Można również dodać wartości do istniejącej tabeli:

INSERT INTO TABLE my_table 
SELECT stack(2 
    , "row4", 1 
    , "row5", 2 
) AS (column1, column2) 
FROM one 
; 
2

Tak można wstawić ale nie tak podobny do SQL.

W SQL możemy wstawić dane poziomu wiersza, ale tutaj można wstawić za pomocą pól (kolumn).

Podczas tego należy upewnić się, że tabela docelowa i zapytanie powinny mieć ten sam typ danych i taką samą liczbę kolumn.

np

CREATE TABLE test(stu_name STRING,stu_id INT,stu_marks INT) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE; 

INSERT OVERWRITE TABLE test SELECT lang_name, lang_id, lang_legacy_id FROM export_table; 
5

Można użyć poniżej podejścia. Dzięki temu nie trzeba tworzyć tabeli tymczasowej LUB pliku txt/csv do dalszego wybierania i ładowania odpowiednio.

INSERT INTO TABLE tablename SELECT value1,value2 FROM tempTable_with_atleast_one_records LIMIT 1. 

Gdzie tempTable_with_atleast_one_records jest jakaś tabela z conajmniej jednego rekordu.

Ale problem z tym podejściem polega na tym, że jeśli masz instrukcję INSERT, która wstawia wiele wierszy, jak poniżej.

INSERT INTO yourTable values (1 , 'value1') , (2 , 'value2') , (3 , 'value3') ; 

Następnie należy utworzyć osobne polecenie INSERT Hive dla każdego wiersza. Zobacz poniżej.

INSERT INTO TABLE yourTable SELECT 1 , 'value1' FROM tempTable_with_atleast_one_records LIMIT 1; 
INSERT INTO TABLE yourTable SELECT 2 , 'value2' FROM tempTable_with_atleast_one_records LIMIT 1; 
INSERT INTO TABLE yourTable SELECT 3 , 'value3' FROM tempTable_with_atleast_one_records LIMIT 1; 
9

Nieco lepsza wersja unique2 sugestia jest poniżej:

insert overwrite table target_table 
select * from 
(
select stack(
    3,     # generating new table with 3 records 
    'John', 80,  # record_1 
    'Bill', 61   # record_2 
    'Martha', 101  # record_3 
    ) 
) s; 

który nie wymaga hack z użyciem tabeli już wychodzącego.

2

Aby wstawić całe dane table2 w table1. Poniżej znajduje się zapytanie:

INSERT INTO TABLE table1 SELECT * FROM table2; 
1

Wprowadź następującą komendę, aby wstawić dane do tabeli testlog z pewnym warunkiem:

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;