Hive插入查询,如SQL

Y0g*_*pta 55 sql hadoop hive hiveql

我是hive的新手,想要知道是否有像我们在SQL中那样将数据插入到hive表中.我想将我的数据插入到hive中

INSERT INTO tablename VALUES (value1,value2..)
Run Code Online (Sandbox Code Playgroud)

我已经读过你可以将数据从一个文件加载到hive表,或者你可以将数据从一个表导入到hive表中,但有没有办法在SQL中附加数据?

mat*_*its 103

这里的一些答案是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);
Run Code Online (Sandbox Code Playgroud)


uni*_*ue2 18

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

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

CREATE TABLE one AS
SELECT 1 AS one
FROM any_table_in_your_database
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建一个包含如下文字值的新表:

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

stack的第一个参数是您生成的行数.

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

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


小智 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;
Run Code Online (Sandbox Code Playgroud)

这不需要黑客使用已经存在的表.


San*_*jiv 7

您可以使用以下方法.有了这个,您不需要创建临时表OR txt/csv文件以分别进一步选择和加载.

INSERT INTO TABLE tablename SELECT value1,value2 FROM tempTable_with_atleast_one_records LIMIT 1.
Run Code Online (Sandbox Code Playgroud)

其中tempTable_with_atleast_one_records是具有至少一条记录的任何表.

但是这种方法的问题在于,如果你有INSERT语句,它插入多行如下.

INSERT INTO yourTable values (1 , 'value1') , (2 , 'value2') , (3 , 'value3') ;
Run Code Online (Sandbox Code Playgroud)

然后,您需要为每一行分别使用INSERT配置单元语句.见下文.

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;
Run Code Online (Sandbox Code Playgroud)


Tar*_*riq 6

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

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

ABC
XYZ
Run Code Online (Sandbox Code Playgroud)

创建一个表并将此文件加载到其中

hive> create table demo(foo string);
hive> load data inpath '/demo.txt' into table demo;
Run Code Online (Sandbox Code Playgroud)

现在,如果我在这张桌子上做一个SELECT,它会给我:

hive> select * from demo;                        
OK    
ABC    
XYZ
Run Code Online (Sandbox Code Playgroud)

假设,我还有一个名为demo2.txt的文件,其中包含:

PQR
Run Code Online (Sandbox Code Playgroud)

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

hive> load data inpath '/demo2.txt' into table demo;
Run Code Online (Sandbox Code Playgroud)

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

hive> select * from demo;                       
OK
ABC
XYZ
PQR
Run Code Online (Sandbox Code Playgroud)

HTH


小智 6

向 Hive 表插入数据的方法: 为了演示,我使用表名称为table1table2

  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. load data inpath 'hdfs_path' overwrite into table table1; --它将从 hdfs 位置加载数据并刷新目标表。或者

    创建表 table2( col1 string, col2 string, col3 string) 行格式分隔字段以 ',' 结尾 位置 'hdfs_location';

  6. load data local inpath 'local_path' into table table1; --它将从本地加载数据并附加到目标表中。

  7. load data inpath 'hdfs_path' into table table1; --它将从 hdfs 位置加载数据并附加到目标表中。

  8. insert into table2 values('aa','bb','cc'); --假设 table2 只有 3 列。

  9. 多次插入 Hive 表


Luk*_*eer 5

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