我是 hive 新手,想知道是否有像我们在 SQL 中那样将数据插入 Hive 表的方法。我想将我的数据插入蜂巢中
INSERT INTO tablename VALUES (value1,value2..)
我已经读到您可以将数据从文件加载到配置单元表,或者您可以将数据从一个表导入配置单元表,但是有没有办法像在 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
将文字值插入到表中。
首先,您需要一个仅包含一行的虚拟表。您可以在限制的帮助下生成它。
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
;
稍微好一点的 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;
这不需要使用已经存在的表进行破解。
您可以使用以下方法。有了这个,您不需要创建临时表或 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;
INSERT INTO tablename VALUES (x,y,z)
否。Hive 当前不支持此语法。
您绝对可以将数据附加到现有表中。(但它实际上不是 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
高温高压
将数据插入 Hive 表的方法: 为了演示,我使用表名作为table1和table2
create table table2 as select * from table1 where 1=1;
或者
create table table2 as select * from table1;
insert overwrite table table2 select * from table1;
--它将数据从一个插入另一个。注意:它将刷新目标。
insert into table table2 select * from table1;
--它将数据从一个插入另一个。注意:它将附加到目标中。
load data local inpath 'local_path' overwrite into table table1;
--它将数据从本地加载到目标表中并刷新目标表。
load data inpath 'hdfs_path' overwrite into table table1;
--它将从hdfs位置加载数据并刷新目标表。或者
创建表 table2( col1 string, col2 string, col3 string) 行格式分隔字段,以 ',' location 'hdfs_location' 结尾;
load data local inpath 'local_path' into table table1;
--它将从本地加载数据并附加到目标表中。
load data inpath 'hdfs_path' into table table1;
--它将从hdfs位置加载数据并附加到目标表中。
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
in 的全部数据table1
。下面是一个查询:
INSERT INTO TABLE table1 SELECT * FROM table2;
您不能插入到插入单条记录。Hive 不支持它。您可以将要插入的所有新记录放入文件中,然后将该文件加载到 Hive 中的临时表中。然后使用 insert overwrite..select 命令将这些行插入到主 Hive 表的新分区中。这里的约束是您的主表必须预先分区。如果您不使用分区,那么您的整个表将被这些新记录替换。
输入以下命令,在某些条件下将数据插入到 testlog 表中:
INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;
我认为在这种情况下,您应该使用 HBASE 来促进这种插入,但它不提供任何 SQL 类型的查询语言。您需要像 put 方法一样使用 HBASE 的 Java API 来进行这种插入。此外,HBASE 是面向列的 no-sql 数据库。
是的,我们可以在 Hive 中使用插入查询。
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
子句将数据插入到复杂数据类型列(数组、映射、结构、联合)中。
您仍然可以在 Hive 中插入复杂类型 - 它可以工作(id 是 int,同事数组)
插入emp (id,colleagues) select 11, array('Alex','Jian') from (select '1')
您也可以将值添加到特定列,只需指定要在其中添加相应值的列名:
Insert into Table (Col1, Col2, Col4,col5,Col7) Values ('Va11','Va2','Val4','Val5','Val7');
确保您跳过的列没有空值类型。
设置几个属性以使 Hive 表支持 ACID 属性并将值插入表中,就像在 SQL 中一样。
在 Hive 中创建 ACID 表的条件。
要设置以创建 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.site.xml 中将属性 hive.in.test 设置为 true
设置所有这些属性后,应使用 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);