我是Hive的新手,想知道是否有办法像在SQL中那样向Hive表中插入数据。我想像下面这样将我的数据插入到Hive中:
INSERT INTO tablename VALUES (value1,value2..)
我读到过可以将数据从文件加载到Hive表中,或者可以将数据从一个表导入到Hive表中,但是是否有像SQL中追加数据的方式?
我是Hive的新手,想知道是否有办法像在SQL中那样向Hive表中插入数据。我想像下面这样将我的数据插入到Hive中:
INSERT INTO tablename VALUES (value1,value2..)
我读到过可以将数据从文件加载到Hive表中,或者可以将数据从一个表导入到Hive表中,但是是否有像SQL中追加数据的方式?
由于Hive 0.14的更新,这里的一些回答已经过时。
现在可以使用以下语法进行插入:
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);
您可以使用表生成函数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
;
稍微改进的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;
不需要使用已经存在的表格来进行黑客攻击。
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 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;
OVERWRITE
子句,新数据就会被放置在不替换旧数据的情况下。对应于该表的目录中将为此新插入的数据创建一个新文件。例如:
我有一个名为demo.txt的文件,其中有2行:
ABC
XYZ
hive> create table demo(foo string);
hive> load data inpath '/demo.txt' into table demo;
hive> select * from demo;
OK
ABC
XYZ
PQR
我再次对这个表进行LOAD操作,但不使用覆盖方式。
hive> load data inpath '/demo2.txt' into table demo;
现在,如果我执行SELECT语句,它会给我:
hive> select * from demo;
OK
ABC
XYZ
PQR
HTH
INSERT INTO tablename VALUES (x,y,z)
语法。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;
注意:这会覆盖掉目标表中原有的数据。insert into table table2 select * from table1;
注意:这会在目标表中追加数据。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列。是的,您可以插入数据,但与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;
将table2
的全部数据插入到table1
中。以下是查询语句:
INSERT INTO TABLE table1 SELECT * FROM table2;
输入以下命令以在带有某些条件的testlog表中插入数据:
INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;