像 SQL 一样的蜂群插入查询

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

INSERT INTO tablename VALUES (value1,value2..)

我读到过,你可以从一个文件中加载数据到 hive 表中,或者你可以从一个表中导入数据到 hive 表中,但是有没有办法像 SQL 那样追加数据呢?

314986 次浏览

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

You can't do insert into to insert single record. It's not supported by Hive. You may place all new records that you want to insert in a file and load that file into a temp table in Hive. Then using insert overwrite..select command insert those rows into a new partition of your main Hive table. The constraint here is your main table will have to be pre partitioned. If you don't use partition then your whole table will be replaced with these new records.

我认为在这种情况下,你应该使用 HBASE,它可以方便这种插入,但它不提供任何 SQL 类型的查询语言。您需要像 put 方法一样使用 HBASE 的 JavaAPI 来执行这种插入。而且 HBASE 是面向列的 no-sql 数据库。

您完全可以将数据附加到现有的表中。(但它实际上不是 HDFS 级别的附加)。只不过,无论何时在没有 OVERWRITE子句的情况下对现有的 Hive 表执行 LOAD 或 INSERT 操作,都会放置新数据,而不会替换旧数据。将为与该表对应的目录中新插入的数据创建一个新文件。例如:

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

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,而不使用 overwrite,

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

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

hive> select * from demo;
OK
ABC
XYZ
PQR

高温

你可以使用表格母函数 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
;

是的,您可以插入,但不像 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;

您可以使用以下方法。这样,就不需要为进一步选择和加载分别创建临时表或 txt/csv 文件。

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

其中 < em > temTable _ with _ at _ one _ record 是至少有一条记录的任意表。

但是这种方法的问题是,如果您有插入多行的 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 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;

它不需要使用已经退出的表进行黑客攻击。

有些答案从蜂巢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);

table1中插入完整的 table2数据。下面是一个查询:

INSERT INTO TABLE table1 SELECT * FROM table2;

输入以下命令,以某些条件将数据插入 testlog 表:

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

是的,我们可以在蜂巢中使用插入查询。

hive> create table test (id int, name string);

INSERT : INSERT... VALUES 从版本0.14开始可用。

hive> insert into table test values (1,'mytest');

这将工作的 insert。我们必须使用 values关键字。

注意: User 不能使用 INSERT INTO...VALUES子句将数据插入复杂的数据类型列(array、 map、 struct、 union)。

向 Hive 表中插入数据的方法: 为了演示,我使用表名作为 表1和 < strong > table2

  1. 或者 create table table2 as select * from table1;

  2. ——它将从一个数据插入到另一个数据中。注意: 它将刷新目标。

  3. ——它将从一个数据插入到另一个数据中。注意: 它将附加到目标中。

  4. ——它将把数据从本地加载到目标表中,并刷新目标表。

  5. --它将从 hdfs 位置加载数据,并刷新目标表。 或者

    创建表2( Col1字符串, Col2字符串, Col3字符串) 行格式分隔的字段以’,’结束 位置‘ hdfs _ location’;

  6. --它将从本地加载数据,并将数据附加到目标表中。

  7. ——它将从 hdfs 位置加载数据,并将数据附加到目标表中。

  8. ——假设表2只有3列。

  9. 多次插入蜂巢表

您仍然可以在 Hive-it works 中插入复杂类型 (id 是 int,partners 数组)

Insert into emp (id,partners) select 11,array (‘ Alex’,‘ Jian’) from (select‘1’)插入 emp (id,partners)中,从(select‘1’)中选择11,数组(‘ Alex’,‘ Jian’)

您也可以向特定列添加值,只需指定要在其中添加相应值的列名:

Insert into Table (Col1, Col2, Col4,col5,Col7) Values ('Va11','Va2','Val4','Val5','Val7');

确保跳过的列没有空值类型。

要使 Hive 表支持 ACID 属性并像 SQL 中那样将值插入表中,需要设置的属性很少。

在 Hive 中创建 ACID 表的条件。

  1. 该表应该存储为 ORC 文件。目前只有 ORC 格式可以支持 ACID 属性。
  2. 这张桌子必须用桶装起来

要设置以创建 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’创建表。这个表应该被桶化并保存为 orc

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