像SQL这样的Hive插入查询

我是新来的蜂巢,并想知道是否有任何将数据插入到蜂巢表中,就像我们在SQL中做的一样。 我想要像我的数据插入蜂巢

INSERT INTO tablename VALUES (value1,value2..) 

我读过,你可以从一个文件的数据加载到Hive表,或者你可以从一个表导入数据到Hive表,但有什么办法来追加数据在SQL中?

这里的一些答案已经过时,比如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); 

您可以使用表生成函数堆栈将文字值插入到表中。

首先你需要一个只包含一行的虚拟表格。 你可以在限制的帮助下生成它。

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

现在你可以用这样的文字值创build一个新的表格:

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

堆栈的第一个参数是您正在生成的行数。

您也可以将值添加到现有的表中:

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

独特2build议的略微更好的版本如下:

 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; 

这不需要使用已经存在的表格进行破解。

您可以将数据附加到现有的表中。 (但它实际上不是HDFS级别的追加)。 只要你在没有OVERWRITE子句的情况下对现有的Hive表进行LOAD或INSERT操作,新的数据将被放置而不replace旧的数据。 这个新插入的数据将在该表所对应的目录中创build一个新文件。 例如 :

我有一个名为demo.txt的文件,它有两行:

 ABC XYZ 

创build一个表并将其加载到该文件中

 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 

而且我在这张桌子上再次进行LOAD,而不使用覆盖,

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

现在,如果我现在做一个SELECT,它会给我,

 hive> select * from demo; OK ABC XYZ PQR 

HTH

你可以使用下面的方法。 有了这个,你不需要创build临时表或ORTX / CSV文件进一步select和加载分别。

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

其中tempTable_with_atleast_one_records是至less有一个logging的任何表。

但是,这种方法的问题是,如果你有INSERT语句插入多行像下面一样。

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

然后,您需要为每个行分别使用INSERTconfiguration单元语句。 见下文。

 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; 

不需要。此Hive中不支持此INSERT INTO tablename VALUES (x,y,z)语法。

是的,你可以插入,但不能像SQL一样。

在SQL中,我们可以插入行级别的数据,但是在这里你可以插入字段(列)。

在此期间,您必须确保目标表和查询应具有相同的数据types和相同数量的列。

例如:

 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; 

您不能插入插入单个logging。 Hive不支持它。 您可以将所有要插入到文件中的新logging放入Hive中的临时表中。 然后使用insert overwrite..select命令将这些行插入主Hive表的新分区。 这里的约束是你的主表必须预分区。 如果你不使用分区,那么你的整个表将被replace为这些新的logging。

table1插入table2整个数据 以下是一个查询:

 INSERT INTO TABLE table1 SELECT * FROM table2; 

我认为在这样的情况下,你应该使用HBASE来促进这种types的插入,但是它不提供任何SQLtypes的查询语言。 您需要像使用put方法一样使用HBASE的Java API来执行这种插入。 另外HBASE是面向列的no-sql数据库。

input以下命令将数据插入到testlog表中,但有一些条件:

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