Запрос на вставку улья, такой как SQL

Я новичок в улье и хочу знать, есть ли способ вставить данные в таблицу улья, как мы это делаем в SQL. Я хочу вставить свои данные в улей, например

INSERT INTO tablename VALUES (value1,value2..)

Я читал, что вы можете загружать данные из файла в таблицу куста или импортировать данные из одной таблицы в таблицу куста, но есть ли способ добавить данные, как в SQL?


person Y0gesh Gupta    schedule 02.07.2013    source источник
comment
Свойства ACID поддерживаются в версии Hive Post 0.14. Так что да, вставка, обновление и удаление возможно, но для операций с одной строкой и одним условием. cwiki.apache.org/confluence/display/Hive/   -  person nilakantha singh deo    schedule 16.05.2020


Ответы (16)


Некоторые ответы здесь устарели, начиная с версии Hive 0.14.

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

Теперь можно вставить, используя такой синтаксис, как:

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);
person mattinbits    schedule 27.07.2015

Вы можете использовать функцию создания таблицы stack для вставки буквальных значений в таблицу.

Сначала вам нужна фиктивная таблица, содержащая только одну строку. Вы можете сгенерировать его с помощью limit.

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

Теперь вы можете создать новую таблицу с такими буквальными значениями:

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

Первый аргумент stack - это количество создаваемых вами строк.

Вы также можете добавить значения в существующую таблицу:

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

Чуть лучшая версия предложения 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;

Что не требует взлома с использованием уже существующей таблицы.

person Habdank    schedule 04.03.2015
comment
Зачем вам нужно добавлять оператор выбора вне стека выбора, это необходимо? - person ryan; 24.05.2018

Вы можете использовать нижеприведенный подход. При этом вам не нужно создавать временную таблицу ИЛИ файл txt / csv для дальнейшего выбора и загрузки соответственно.

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

Где tempTable_with_atleast_one_records - любая таблица с хотя бы одной записью.

Но проблема с этим подходом заключается в том, что если у вас есть оператор INSERT, который вставляет несколько строк, как показано ниже.

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

Затем вам понадобится отдельный оператор INSERT hive для каждой строки. См. ниже.

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;
person Sanjiv    schedule 11.11.2014

Нет. Этот INSERT INTO tablename VALUES (x,y,z) синтаксис в настоящее время не поддерживается в Hive.

person Lukas Vermeer    schedule 02.07.2013
comment
есть ли способ добавить данные в свою таблицу, как мы это делаем в SQL. - person Y0gesh Gupta; 02.07.2013
comment
INSERT INTO tablename SELECT ... поддерживается, поэтому вы можете поместить новые данные во временную таблицу, а затем вставить их, выбрав оттуда. - person Lukas Vermeer; 02.07.2013
comment
Я хочу добавить данные в куст через java-клиент, будет ли это работать, если я создам временную таблицу данных в java и напишу запрос вставки и выбора только в моем java-клиенте? - person Y0gesh Gupta; 02.07.2013
comment
Если вы используете Java, почему бы не добавить напрямую к файлу в HDFS? Hive не подходит для этого. - person Lukas Vermeer; 03.07.2013

Вы определенно можете добавить данные в существующую таблицу. (Но на самом деле это не приложение на уровне HDFS). Просто всякий раз, когда вы выполняете операцию LOAD или INSERT для существующей таблицы Hive без предложения OVERWRITE, новые данные будут помещены без замены старых данных. Для этих вновь вставленных данных будет создан новый файл в каталоге, соответствующем этой таблице. Например :

У меня есть файл с именем demo.txt, в котором есть 2 строки:

ABC
XYZ

Создайте таблицу и загрузите в нее этот файл

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

Теперь, если я сделаю SELECT для этой таблицы, это даст мне:

hive> select * from demo;                        
OK    
ABC    
XYZ

Предположим, у меня есть еще один файл с именем demo2.txt, в котором есть:

PQR

И я снова делаю ЗАГРУЗКУ для этого стола без перезаписи,

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

Теперь, если я сделаю ВЫБРАТЬ сейчас, это даст мне,

hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH

person Tariq    schedule 03.07.2013

Способы вставки данных в таблицу улья: для демонстрации я использую имя таблицы как table1 и table2

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

2) insert overwrite table table2 select * from table1; - будет вставлять данные из одного в другой. Примечание: это обновит цель.

3) insert into table table2 select * from table1; - вставит данные из одного в другой. Примечание: он добавится в цель.

4) load data local inpath 'local_path' overwrite into table table1; - он загрузит данные из локальной в целевую таблицу, а также обновит целевую таблицу.

5) load data inpath 'hdfs_path' overwrite into table table1; - он загрузит данные из местоположения hdfs i, а также обновит целевую таблицу. или

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; - он загрузит данные из локального, а также добавит в целевую таблицу.

7) load data inpath 'hdfs_path' into table table1; - он загрузит данные из местоположения hdfs, а также добавит их в целевую таблицу.

8) insert into table2 values('aa','bb','cc'); - Допустим, в таблице 2 всего 3 столбца.

9) Множественная вставка в таблицу улья

person Brijesh Mishra    schedule 10.06.2018

Да, вы можете вставлять, но не так похоже на SQL.

В SQL мы можем вставлять данные на уровне строк, а здесь можно вставлять по полям (столбцам).

При этом вы должны убедиться, что целевая таблица и запрос должны иметь одинаковый тип данных и одинаковое количество столбцов.

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;
person user3279425    schedule 04.03.2014

Чтобы вставить все данные table2 в table1. Ниже приводится запрос:

INSERT INTO TABLE table1 SELECT * FROM table2; 
person Ramesh babu M    schedule 12.07.2017

Вы не можете вставить в, чтобы вставить одну запись. Это не поддерживается Hive. Вы можете поместить все новые записи, которые хотите вставить в файл, и загрузить этот файл во временную таблицу в Hive. Затем с помощью команды insert overwrite..select вставьте эти строки в новый раздел вашей основной таблицы Hive. Ограничение здесь заключается в том, что ваша основная таблица должна быть предварительно разбита на разделы. Если вы не используете разделение, вся ваша таблица будет заменена этими новыми записями.

person Arijit Banerjee    schedule 03.07.2013
comment
Не совсем правильно. INSERT INTO добавит в таблицу или раздел, сохраняя существующие данные в неизменном виде. (Примечание: синтаксис INSERT INTO доступен только начиная с версии 0.8) cwiki.apache.org/confluence/display/Hive/ - person Lukas Vermeer; 03.07.2013

Введите следующую команду, чтобы вставить данные в таблицу журнала тестов с некоторым условием:

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;
person Don    schedule 22.11.2017

Я думаю, что в таких сценариях вы должны использовать HBASE, который облегчает такую ​​вставку, но не предоставляет никакого языка запросов SQL. Для такой вставки вам нужно использовать Java API HBASE, например метод put. Кроме того, HBASE - это база данных без sql, ориентированная на столбцы.

person Binary01    schedule 03.07.2013

Вы все еще можете вставлять в сложный тип в Hive - он работает (id - int, массив коллег)

вставить в emp (id, коллеги) выберите 11, массив ('Alex', 'Jian') из (выберите '1')

person Hemant    schedule 27.07.2019

вы также можете добавлять значения в определенные столбцы, просто укажите имена столбцов, в которые вы хотите добавить соответствующие значения:

Insert into Table (Col1, Col2, Col4,col5,Col7) Values ('Va11','Va2','Val4','Val5','Val7');

Убедитесь, что пропущенные столбцы не имеют типа нулевого значения.

person jitesh2796    schedule 14.05.2020

Да, мы можем использовать запрос Insert в улье.

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

INSERT: INSERT ... VALUES доступен начиная с версии 0.14.

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

Это будет работать для insert. Мы должны использовать ключевое слово values.

Примечание. Пользователь не может вставлять данные в столбец сложного типа (массив, карта, структура, объединение) с помощью предложения INSERT INTO...VALUES.

person Viraj Wadate    schedule 12.03.2018

Есть несколько свойств, которые нужно установить, чтобы таблица Hive поддерживала свойства ACID и вставляла значения в таблицы, как в SQL.

Условия для создания таблицы ACID в Hive.

  1. Таблица должна быть сохранена как файл ORC. На данный момент только формат ORC может поддерживать свойства ACID.
  2. Стол должен быть переплетен

Свойства, которые нужно установить для создания таблицы ACID:

set hive.support.concurrency =true;
set hive.enforce.bucketing =true;
set hive.exec.dynamic.partition.mode =nonstrict
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads= 1;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

установите для свойства hive.in.test значение true в hive.site.xml

После установки всех этих свойств таблица должна быть создана с tblproperty 'transactional' = 'true'. Стол должен быть скомпонован и сохранен как орк.

CREATE TABLE table_name (col1 int,col2 string, col3 int) CLUSTERED BY col1 INTO 4 

BUCKETS STORED AS orc tblproperties('transactional' ='true');

Теперь можно вставлять значения в таблицу как SQL-запрос.

INSERT INTO TABLE table_name VALUES (1,'a',100),(2,'b',200),(3,'c',300);

person kiruba    schedule 25.05.2020