Hive插入查询类似于SQL。

74

我是Hive的新手,想知道是否有办法像在SQL中那样向Hive表中插入数据。我想像下面这样将我的数据插入到Hive中:

INSERT INTO tablename VALUES (value1,value2..)

我读到过可以将数据从文件加载到Hive表中,或者可以将数据从一个表导入到Hive表中,但是是否有像SQL中追加数据的方式?


Hive 0.14版本后支持ACID属性。因此,可以进行插入、更新和删除操作,但仅限于单行和单条件操作。详见https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingvaluesintotablesfromSQL。 - nilakantha singh deo
16个回答

134

失败:解析错误:第1行第28个字符无法识别'VARCHAR' '(' '64'在列类型中。 - pavel_orekhov

21

您可以使用表生成函数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
;
< p > stack 的第一个参数是您要生成的行数。

您还可以向现有表添加值:


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

16

稍微改进的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;

不需要使用已经存在的表格来进行黑客攻击。


1
为什么需要在 select 堆栈外添加一个 select 语句,这是必要的吗? - ryan

8
您可以使用以下方法。这样,您就不需要创建临时表或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;

6
您可以将数据追加到现有表中。 (但实际上在HDFS级别上并不是追加)。只要您在现有的Hive表上执行LOAD或INSERT操作而没有使用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

我再次对这个表进行LOAD操作,但不使用覆盖方式。

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

现在,如果我执行SELECT语句,它会给我:

hive> select * from demo;                       
OK
ABC
XYZ
PQR

HTH


6
不行。目前Hive不支持这种 INSERT INTO tablename VALUES (x,y,z) 语法。

有没有办法可以绕过去,像在SQL中一样向我的表中添加数据。 - Y0gesh Gupta
1
支持使用“INSERT INTO tablename SELECT…”语句,因此您可以将新数据放入临时表中,然后通过从该表中选择插入。 - Lukas Vermeer
我想通过Java客户端在Hive中追加数据,如果我在Java中创建一个临时数据表并在我的Java客户端中编写插入和选择查询,这样做可以吗? - Y0gesh Gupta
如果您正在使用Java,为什么不直接将内容附加到HDFS文件中呢?Hive并不是很适合这种情况。 - Lukas Vermeer

6
插入数据到Hive表的方法如下: (为了演示方便,我使用的表名是table1和table2)
1. 创建一个新表并将旧表的所有数据复制到新表中: create table table2 as select * from table1 where 1=1; 或者 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. 从HDFS加载数据到目标表中,并刷新目标表: load data inpath 'hdfs_path' overwrite into table table1; 或者

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. 从HDFS加载数据到目标表中,并将数据追加到目标表中: load data inpath 'hdfs_path' into table table1; 8. 插入一条数据到table2中: insert into table2 values('aa','bb','cc'); 注意:假设table2只有3列。
9. 批量插入数据到Hive表中。

3

是的,您可以插入数据,但与SQL不同。

在SQL中,我们可以插入行级数据,但在这里,您只能按字段(列)插入。

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

例如:

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;

3

table2的全部数据插入到table1中。以下是查询语句:

INSERT INTO TABLE table1 SELECT * FROM table2; 

2

输入以下命令以在带有某些条件的testlog表中插入数据:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接