web-dev-qa-db-fra.com

Requête d'insertion Hive comme SQL

Je suis nouveau sur Hive et je veux savoir s’il est quand même possible d’insérer des données dans la table Hive comme nous le faisons en SQL. Je veux insérer mes données dans Hive comme

INSERT INTO tablename VALUES (value1,value2..)

J'ai lu que vous pouvez charger les données d'un fichier dans la table Hive ou importer des données d'une table dans une table Hive, mais existe-t-il un moyen d'ajouter les données comme dans SQL?

53
Y0gesh Gupta

Certaines des réponses ici ne sont plus à jour en date de Hive 0.14

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

Il est maintenant possible d'insérer en utilisant une syntaxe telle que:

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);
98
mattinbits

Vous pouvez utiliser la pile de fonctions générant des tables pour insérer des valeurs littérales dans une table.

Vous avez d’abord besoin d’une table factice qui ne contient qu’une ligne. Vous pouvez le générer à l'aide de limit.

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

Maintenant, vous pouvez créer une nouvelle table avec des valeurs littérales comme ceci:

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

Le premier argument de pile est le nombre de lignes que vous générez.

Vous pouvez également ajouter des valeurs à une table existante:

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

Une version légèrement meilleure de la suggestion unique2 est ci-dessous:

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;

Ce qui ne nécessite pas le bidouillage avec l'utilisation d'une table déjà existante.

16
Habdank

Vous pouvez utiliser l'approche ci-dessous. Avec cela, vous n'avez pas besoin de créer une table temporaire OR fichier txt/csv pour une sélection et un chargement supplémentaires.

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

tempTable_with_atleast_one_records est une table comportant au moins un enregistrement.

Mais le problème avec cette approche est que Si vous avez une instruction INSERT, celle-ci insère plusieurs lignes comme ci-dessous.

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

Ensuite, vous devez avoir une instruction INSERT Hive distincte pour chaque ligne. Voir ci-dessous.

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;
7
Sanjiv

Vous pouvez certainement ajouter des données dans une table existante. (Mais ce n'est en fait pas un ajout au niveau HDFS). C'est juste que chaque fois que vous effectuez une opération LOAD ou INSERT sur une table Hive existante sans la clause OVERWRITE, les nouvelles données seront placées sans remplacer les anciennes données. Un nouveau fichier sera créé pour ces données nouvellement insérées dans le répertoire correspondant à cette table. Par exemple :

J'ai un fichier nommé demo.txt qui a 2 lignes:

ABC
XYZ

Créer une table et y charger ce fichier

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

Maintenant, si je fais un SELECT sur cette table, il me donnera:

Hive> select * from demo;                        
OK    
ABC    
XYZ

Supposons que j’ai encore un fichier nommé demo2.txt qui a:

PQR

Et je fais encore une charge sur cette table sans utiliser écraser,

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

Maintenant, si je fais un SELECT maintenant, ça va me donner,

Hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH

6
Tariq

Non. Cette syntaxe INSERT INTO tablename VALUES (x,y,z) n'est actuellement pas prise en charge dans Hive.

4
Lukas Vermeer

Pour insérer des données entières de table2 dans table1. Ci-dessous une requête:

INSERT INTO TABLE table1 SELECT * FROM table2; 
3
Ramesh babu M

Entrez la commande suivante pour insérer des données dans la table testlog avec certaines conditions:

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

Oui, vous pouvez insérer mais pas aussi semblable au SQL.

En SQL, nous pouvons insérer les données au niveau de la ligne, mais ici, vous pouvez insérer par champs (colonnes).

Pendant ce temps, vous devez vous assurer que la table cible et la requête doivent avoir le même type de données et le même nombre de colonnes.

par exemple:

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
user3279425

Vous ne pouvez pas insérer dans pour insérer un seul enregistrement. Ce n'est pas supporté par Hive. Vous pouvez placer tous les nouveaux enregistrements que vous souhaitez insérer dans un fichier et charger ce fichier dans une table temporaire dans Hive. Utilisez ensuite la commande insert overwrite..select pour insérer ces lignes dans une nouvelle partition de votre table Hive principale. La contrainte ici est que votre table principale devra être pré-partitionnée. Si vous n'utilisez pas de partition, votre table entière sera remplacée par ces nouveaux enregistrements.

1
Arijit Banerjee

Vous pouvez toujours insérer un type complexe dans Hive - cela fonctionne (id est Int, tableau des collègues)

insérer dans emp (id, collègues) sélectionner 11, tableau ('Alex', 'Jian') à partir de (sélectionner '1')

0
Hemant

Je pense que dans de tels scénarios, vous devriez utiliser HBASE, qui facilite ce type d’insertion mais ne fournit aucun type de langage de requête SQL. Vous devez utiliser Java API de HBASE comme méthode put pour effectuer ce type d'insertion. De plus, HBASE est une base de données no-sql orientée colonne.

0
Binary01

Façons d'insérer des données dans la table Hive: pour la démonstration, j'utilise le nom de la table comme table1 et table2

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

2) insert overwrite table table2 select * from table1; - il insérera des données de l'un à l'autre. Note: Cela actualisera la cible.

3) insert into table table2 select * from table1; - il insérera des données de l'un à l'autre. Note: Il va s’ajouter à la cible.

4) load data local inpath 'local_path' overwrite into table table1; --it chargera les données de local dans la table cible et actualisera également la table cible.

5) load data inpath 'hdfs_path' overwrite into table table1; --il chargera les données de l'emplacement hdfs et actualisera également la table cible. ou

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; --il va charger les données de local et les ajouter à la table cible.

7) load data inpath 'hdfs_path' into table table1; --it chargera les données de l'emplacement hdfs et les ajoutera également dans la table cible.

8) insert into table2 values('aa','bb','cc'); - Disons que la table2 n'a que 3 colonnes.

9) Insertion multiple dans la table Hive

0
Brijesh Mishra

Oui, nous pouvons utiliser une requête d'insertion dans Hive.

Hive> test de création de table (id int, chaîne de nom);

INSERT: INSERT ... VALUES est disponible à partir de la version: Hive 0.14.

Hive> insérer dans la table des valeurs de test (1, 'mytest'););

Cela va fonctionner pour l'insertion. nous devons utiliser valeurs mot-clé.

Remarque: l'utilisateur ne peut pas insérer de données dans une colonne de type de données complexe (tableau, carte, structure, union) à l'aide de la clause ** INSERT INTO ... VALUES.

0
Viraj.Hadoop