数据操作语句
-- 例表 |
将文件加载到表中
Hive 在将数据加载到表中时不做任何转换。加载操作目前是纯复制/移动操作,将数据文件移动到对应于 Hive 表的位置。
LOAD DATA [LOCAL] INPATH 'filepath' |
- filepath 可以是相对路径或绝对路径
- 关键字 LOCAL 标识符指定本地路径,否则为hdfs路径
- 关键字 OVERWRITE 指定覆盖目标表(或分区)中的数据,否则将添加到表中。
LOAD DATA LOCAL INPATH /tmp/pv_2008-06-08_us.txt INTO TABLE page_view PARTITION(date='2008-06-08', country='US') |
也可以先将文件移动到 Hive 表的位置,然后手动修复,将有关分区的元数据更新到 Hive Metastore
hadoop dfs -put /tmp/pv_2008-06-08.txt /user/data/staging/page_view |
将查询结果插入表中
INSERT OVERWRITE TABLE tablename |
可以在同一个查询中指定多个插入子句(也称为多表插入)。多表插入最大限度地减少了所需的数据扫描次数。通过对输入数据仅扫描一次(并应用不同的查询运算符),Hive 可以将数据插入到多个表中。
FROM from_statement |
FROM page_view_stg pvs |
动态分区插入
动态分区插入(或多分区插入)旨在通过在扫描输入表时动态确定应创建和填充哪些分区。如果尚未创建该分区,它将自动创建该分区。
动态分区列必须在 SELECT 语句中的列中最后指定,并且必须与在 PARTITION 子句中出现的顺序相同。
动态分区字段一定要放在所有静态字段的后面。
INSERT OVERWRITE TABLE tablename |
例子:这里country 是一个动态分区列
-- 动静分区结合 |
这些是动态分区插入的相关配置属性:
配置属性 | 默认 | 笔记 |
---|---|---|
hive.exec.dynamic.partition |
true |
需要设置true 为启用动态分区插入 |
hive.error.on.empty.partition |
false |
动态分区插入产生空结果是否抛出异常 |
hive.exec.dynamic.partition.mode |
strict |
在strict 模式下,用户必须指定至少一个静态分区。在nonstrict 模式的所有分区被允许是动态 |
hive.exec.max.created.files |
100000 | MapReduce 作业中所有映射器/还原器创建的 HDFS 文件的最大数量 |
hive.exec.max.dynamic.partitions |
1000 | 总共允许创建的最大动态分区数 |
hive.exec.max.dynamic.partitions.pernode |
100 | 每个mapper/reducer节点允许创建的最大动态分区数 |
hive.exec.default.partition.name |
如果分区列值为 NULL 或空字符串,则该行将被放入一个特殊分区,默认值为HIVE_DEFAULT_PARTITION 。 |
将数据写入文件系统
-- Standard syntax: |
- 关键字 LOCAL 标识符指定本地路径,否则为hdfs路径
- 写入文件系统的数据被序列化为文本。如果任何列不是原始数据类型,则这些列将序列化为 JSON 格式。
- row_format 语法如下,用法见 CREATE TABLE
-- row_format: |
-- 输出写入本地文件 |
也可以使用 shell 命令写入本地
hive -e "SELECT ... FROM ...;" > local_path |
向表中插入值
INSERT INTO TABLE tablename |
- VALUES 子句中列出的每一行都插入到表tablename 中。
- 必须为表中的每一列提供值。尚不支持允许用户仅将值插入某些列的标准 SQL 语法。为了模仿标准 SQL,可以为用户不希望为其分配值的列提供空值。
- 动态分区的支持方式与 INSERT…SELECT 相同。
- Hive 不支持INSERT INTO…VALUES 子句中使用复杂类型(数组、映射、结构、联合)。
CREATE TABLE pageviews (userid VARCHAR(64), link STRING, came_from STRING) |
更新数据
UPDATE tablename SET column = value [, column = value ...] [WHERE expression] |
- 分配的值必须是 Hive 在 select 子句中支持的表达式。因此支持算术运算符、UDF、强制转换、文字等。不支持子查询。
- 只有匹配 WHERE 子句的行才会被更新。
- 无法更新分区列,无法更新分桶列。
- 成功完成此操作后,将自动提交更改。
删除数据
DELETE FROM tablename [WHERE expression] |
- 只有匹配 WHERE 子句的行才会被删除。
- 成功完成此操作后,将自动提交更改。
合并操作
MERGE 从Hive 2.2开始可用,允许根据与源表的连接结果对目标表执行操作。
MERGE INTO <target table> AS T USING <source expression/table> AS S |
- 可能存在 1、2 或 3 个 WHEN 子句;每种类型最多 1 个:UPDATE/DELETE/INSERT。
- WHEN NOT MATCHED 必须是最后一个 WHEN 子句。
- 如果 UPDATE 和 DELETE 子句都存在,则语句中的第一个子句必须包含
[AND <boolean expression>]
。
CREATE DATABASE merge_data; |
INSERT INTO merge_data.transactions PARTITION (tran_date) VALUES |
MERGE INTO merge_data.transactions AS T |
SELECT * FROM merge_data.transactions order by ID; |
导入导出
EXPORT
命令将表或分区的数据以及元数据导出到指定位置。IMPORT
命令从指定位置导入。
EXPORT
和IMPORT
命令中使用的源和目标metastore DBMS的独立工作。例如,它们可以在 Derby 和 MySQL 数据库之间使用。
-- 导出语法 |
如果目标不存在,IMPORT
将创建目标表/分区。所有表属性/参数都将是用于EXPORT
生成存档的表的属性/参数。如果目标存在,则检查它是否具有适当的架构、输入/输出格式等。如果目标表存在且未分区,则它必须为空。如果目标表存在且已分区,则表中不得存在要导入的分区。
例子
简单的导出和导入:
export table department to 'hdfs_exports_location/department'; |
导入时重命名表:
export table department to 'hdfs_exports_location/department'; |
导出分区和导入:
export table employee partition (emp_country="in", emp_state="ka") |
导出表和导入分区:
export table employee to 'hdfs_exports_location/employee'; |
指定导入位置:
export table department to 'hdfs_exports_location/department'; |
导入为外部表:
export table department to 'hdfs_exports_location/department'; |
评论