Hive Insert命令

本文详细介绍了Hive中数据加载的两种主要方式:Load和Insert命令,并深入探讨了不同版本Hive在Insert命令上的支持与改进,包括标准语法、高级语法、动态分区插入及其相关配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hive 加载数据主要有两种方式,一种是用Load直接加载文件,可以是从本地文件系统,也可以是从HDFS文件系统;Load方式不做任何的转换,只是纯粹的文件复制移动,关于Load加载详情,请见我的另一篇文章: http://blog.youkuaiyun.com/post_yuan/article/details/62883565

除了Load加载数据,Hive也支持Insert命令,下面就来详细介绍Hive不同的版本在Insert方面的支持和改进,

标准语法

INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)](z, y) select_statement1 FROM from_statement;

高级语法(Multiple Inserts)

FROM from_statement
INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2];

高级语法(Dynamic Partition Inserts)

INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

描述

  • INSERT OVERWRITE会覆盖表或分区中已存在的数据
  • INSERT INTO以追加数据的方式插入到表或分区,原有数据不会删除
  • Insert可以插入表或分区,如果表是分区表,则Insert时需要指定插入到哪个分区
  • 从Hive 1.1.0版本,TABLE关键字是可选的
  • 从Hive 1.2.0版本,INSERT INTO可以指定插入到哪些字段中,如INSERT INTO t(x,y,z)

动态分区插入

当INSERT往分区表插入数据时,我们可以指定分区字段名和值,分区字段的值是可选的,如果指定分区字段值,我们称之为静态分区,否则称之为动态分区。动态分区创建根据插入数据的列决定。在Hive 0.9.0版本以前,动态分区插入默认是关闭的,在Hive 0.9.0版本及更高版本,默认是打开的。关于动态分区插入,有几个相关的配置:

参数默认值注释
hive.exec.dynamic.partitiontrue设置为true表示启用动态分区插入
hive.exec.dynamic.partition.modestrictstrict模式时用户必须至少指定一个静态分区;nonstrict模式时所有分区都可能是动态分区
hive.exec.max.dynamic.partitions.pernode100每个mapper/reducer节点允许创建的最大动态分区数
hive.exec.max.dynamic.partitions1000总共允许创建的最大动态分区数
hive.exec.max.created.files100000一个MR job中允许创建多少个HDFS文件
hive.error.on.empty.partitionfalse当动态分区插入产生空值时是否抛出异常

从查询语句写入到文件系统

Hive支持从查询语句直接写入到文件系统,此处不做详细介绍

INSERT VALUES

Hive 0.14版本开始,支持INSERT…VALUES语法,具体语法如下,

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

values_row:
(value [, value ...])
value可以为null或者任意SQL语法
### Hive基础命令列表及用法 #### 创建数据库 用于创建新的数据库。 ```sql CREATE DATABASE database_name; ``` 此命令会创建一个名为 `database_name` 的新数据库[^1]。 #### 使用数据库 切换到指定的数据库。 ```sql USE database_name; ``` #### 查看现有数据库 显示当前可用的所有数据库。 ```sql SHOW DATABASES; ``` #### 删除数据库 删除不再需要的数据库。 ```sql DROP DATABASE database_name; ``` 注意:只有当数据库为空时才能被删除[^2]。 #### 创建表 创建一张新表。 ```sql CREATE TABLE table_name (column1 datatype, column2 datatype); ``` #### 加载数据 将本地文件加载到Hive表中。 ```bash hadoop fs -put /path/to/local/file /path/in/hdfs/ LOAD DATA INPATH '/path/in/hdfs/' INTO TABLE table_name; ``` 或者直接从本地路径加载: ```sql LOAD DATA LOCAL INPATH '/local/path' INTO TABLE table_name; ``` #### 查询数据 查询表中的数据。 ```sql SELECT * FROM table_name; ``` #### 数据排序 使用 `ORDER BY` 对结果集进行全局排序。需要注意的是,这会使整个作业只使用单个 reducer 来完成排序工作。 ```sql SELECT * FROM table_name ORDER BY column_name; ``` 如果希望并行处理多个 reducer 并仅在每个 reducer 输出内部排序,则可以使用 `SORT BY`[^2]: ```sql SELECT * FROM table_name SORT BY column_name; ``` #### 过滤数据 通过条件过滤数据。 ```sql SELECT * FROM table_name WHERE condition; ``` #### 插入数据 向表中插入数据。 ```sql INSERT INTO TABLE table_name SELECT * FROM another_table; ``` #### 修改表结构 添加列至现有的表。 ```sql ALTER TABLE table_name ADD COLUMNS (new_column datatype); ``` #### 删除表 移除不需要的表及其所有数据。 ```sql DROP TABLE table_name; ``` #### 显示表详情 查看特定表的信息。 ```sql DESCRIBE FORMATTED table_name; ``` #### 导出数据 导出表的数据到 HDFS 或者本地磁盘。 ```bash INSERT OVERWRITE DIRECTORY '/output/directory' SELECT * FROM table_name; ``` 对于本地存储: ```bash hive -e "SELECT * FROM table_name;" > /local/output/file.txt ``` #### 启动服务 启动 Hive Metastore 和 HiveServer2 服务以便客户端连接访问。 ```bash hive --service metastore & hive --service hiveserver2 & ``` 可以通过以下方式验证 HiveServer2 是否正常运行[^1]: ```bash netstat -anop | grep 10000 ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值