Hive Wstaw zapytanie jak SQL

Jestem nowy w hive, i chcę wiedzieć, czy jest i tak do wstawiania danych do tabeli hive jak to robimy w SQL. Chcę wstawić swoje dane do ula jak

INSERT INTO tablename VALUES (value1,value2..)

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

Author: Y0gesh Gupta, 2013-07-02

13 answers

Niektóre z odpowiedzi tutaj są nieaktualne od Hive 0.14

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

Jest teraz możliwe wstawianie za pomocą składni takiej 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);
 81
Author: mattinbits,
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
2015-07-27 14:55:27

Możesz użyć stosu funkcji generującej tabelę do wstawiania wartości literalnych do tabeli.

Najpierw potrzebujesz tabeli, która zawiera tylko jeden wiersz. Możesz go wygenerować za pomocą limit.

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

Teraz możesz utworzyć nową tabelę z literałowymi wartościami takimi jak:

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

Pierwszym argumentem stosu jest liczba generowanych wierszy.

Możesz 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
;
 16
Author: unique2,
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
2013-09-20 08:55:44

Poniżej nieco lepsza wersja sugestii unique2:

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 włamania z użyciem już wychodzącej tabeli.

 11
Author: Habdank,
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
2015-03-04 15:34:04

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 ilekroć wykonasz operację LOAD lub INSERT na istniejącej tabeli Hive bez OVERWRITE klauzuli, nowe dane zostaną wprowadzone 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

Utwórz tabelę i załaduj do niego ten plik

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

Teraz, jeśli zrobię SELECT na tym stole to Da Mi:

hive> select * from demo;                        
OK    
ABC    
XYZ

Załóżmy, że mam jeszcze jeden plik o nazwie demo2.txt który ma:

PQR

I robię Ładowanie ponownie na tej tabeli bez użycia nadpisywania,

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

Teraz, jeśli zrobię SELECT teraz, to Da Mi,

hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH

 5
Author: Tariq,
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
2013-07-03 14:52:52

Możesz użyć poniższego podejścia. Dzięki temu nie musisz tworzyć tabeli tymczasowej ani pliku TXT / csv, aby odpowiednio wybrać i załadować.

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

Gdzie tempTable_with_atleast_one_records jest dowolną tabelą z co najmniej jednym rekordem.

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

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

Następnie musisz mieć oddzielną instrukcję INSERT hive dla każdego wiersza. Patrz 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;
 5
Author: Sanjiv,
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
2014-11-11 07:09:23

Nie. Składnia INSERT INTO tablename VALUES (x,y,z) nie jest obecnie obsługiwana w Hive.

 3
Author: Lukas Vermeer,
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
2013-07-02 12:48:20

Tak można wstawić, ale nie tak jak SQL.

W SQL możemy wstawić dane poziomu wiersza, ale tutaj można wstawiać pola (kolumny).

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

Eg:

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;
 2
Author: user3279425,
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
2014-03-04 11:30:43

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

INSERT INTO TABLE table1 SELECT * FROM table2; 
 2
Author: Ramesh babu M,
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
2017-07-12 13:16:34

Nie można wstawić do wstawiania pojedynczego rekordu. Nie jest obsługiwana 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 użyj Wstaw nadpisać..wybierz polecenie Wstaw te wiersze do nowej partycji głównej tabeli Ula. Ograniczeniem jest to, że główna tabela będzie musiała być wstępnie podzielona. Jeśli nie używasz partycji, cała Twoja tabela zostanie zastąpiona tymi nowymi rekordami.

 1
Author: Arijit Banerjee,
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
2013-07-03 06:11:48

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

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;
 1
Author: Don,
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
2017-11-22 16:03:09

Myślę, że w takich scenariuszach powinieneś używać HBASE, który ułatwia tego rodzaju wstawianie, ale nie dostarcza żadnego języka zapytań typu SQL. Musisz użyć Java API HBASE jak metoda put do tego rodzaju wstawiania. Ponadto HBase jest kolumnową bazą danych no-SQL.

 0
Author: Binary01,
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
2013-07-03 12:50:26

Tak możemy użyć zapytania Insert w ulu.

Hive> create table test (id int, name string);

INSERT : INSERT...Wartości są dostępne począwszy od wersji: Hive 0.14 .

Hive> insert into table test values (1,'mytest');

To będzie działać dla insert. musimy użyć słowa kluczowego wartości.

Uwaga: Użytkownik nie może wstawiać danych do złożonej kolumny typu danych (array, map, struct, union) za pomocą **INSERT Do...Klauzula wartości.

 0
Author: Viraj.Hadoop,
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-03-12 07:20:51

Sposoby wstawiania danych do tabeli hive: do demonstracji używam nazwy tabeli jako table1 i table2

1) create table table2 as select * from table1 where 1=1; lub create table table2 as select * from table1;

2) insert overwrite table table2 select * from table1; -- będzie wstawiać dane od jednego do drugiego. Uwaga: odświeży cel.

3) insert into table table2 select * from table1; -- będzie wstawiać dane od jednego do drugiego. Uwaga: dopisze się do celu.

4) load data local inpath 'local_path' overwrite into table table1; --wczytuje dane z lokalnego do docelowej tabeli oraz odświeży docelową stolik.

5) load data inpath 'hdfs_path' overwrite into table table1; -- załaduje dane z hdfs location I oraz odświeży tabelę docelową. lub

create table table2(
    col1 string,
    col2 string,
    col3 string)
    row format delimited fields terminated by ','
    location 'hdfs_location'; 

6) load data local inpath 'local_path' into table table1; --wczytuje dane z lokalnego i dopisze do docelowej tabeli.

7) load data inpath 'hdfs_path' into table table1; -- załaduje dane z lokalizacji hdfs, a także dopisze do tabeli docelowej.

8) insert into table2 values('aa','bb','cc'); -- Powiedzmy, że table2 ma tylko 3 kolumny.

9) wielokrotne wstawianie do tabeli ula

 0
Author: Brijesh Mishra,
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-06-10 08:51:57