Hive6 数据操作

Hive6 数据操作

更多整理都在我的github上:Auraros欢迎大家。

Hive中没有行级别的数据插入、数据更新和删除操作,唯一途径就是使用“大量”的数据装载操作。

向管理表中装载数据

LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
  • partition:如果分区目录不存在的话,这个命令会先创建分区目录,然后再将数据拷贝到该目录下。如果目标表是非分区表,那么语句中省略PARTITION子句

  • local: 如果使用了LOCAL这个关键字,那么这个路径应该为本地文件系统路径,数据将会被拷贝到目标位置。如果省略掉LOCAL这个关键字,那么这个路径应该是分布式文件系统中的路径。

  • OVERWRITE: 如果制定了这个关键字,那么目标文件中之前存在的数据将会被先删除掉,如果没有这个关键字,仅仅会把新增的文件加到目标文件中而不会删除之前的数据

通过查询语句向表中插入数据

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
  • OVERWRITE: 之前分区中的内容将会被覆盖掉,否则以追加的方式写入文件
  • 场景:数据已经存在于某个目录下,对于Hive来说其为一个外部表,而现在想将其导入到最终的分区表中。如果用户想将源表数据导入到一个具有不同记录格式的目标。

如果staged_employees 非常大,而且用户需要对 65个州都执行这些语句,那么也就意味着需要扫描表65次。Hive提供了另一种插入方法。

FROM staged_employees se
INSERT OVERWRITE TABLE employees
	PARTITION (country = 'US', state = 'OR')
	SELECT * FROM WHERE se.cnty = 'US' AND se.st = 'OR';
INSERT OVERWRITE TABLE employees
	PARTITION (country = 'US', state = 'CA')
	SELECT * FROM WHERE se.cnty = 'US' AND se.st = 'CA';
INSERT OVERWRITE TABLE employees
	PARTITION (country = 'US', state = 'IL')
	SELECT * FROM WHERE se.cnty = 'US' AND se.st = 'IL';

动态分区插入

需要创建非常多的分区,那么用户就需要写非常多的SQL,Hive提供了一个动态分区功能,其可以基于查询参数推断出需要创建的分区名称。

INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;

假设表staged_employees 中共有100个国家和州,执行完上面的查询后,表employees就有100个分区。

也可以混合静态和动态,其中,静态分区必须出现在动态分区键之前

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';

动态分区的属性值:

属性名称缺省值描述
hive.exec.dynamic.partitionfalse设置为true,表示开启动态分区功能
hive.exec.dynamic.partition.modestrict设置为nonstrict,表示允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode100每个mapper或reducer可以创建的最大动态分区个数,如果某个mapper或reducerr尝试打羽这个值会报错
hive.exec.max.dynamic.partitions+1000一个动态分区创建语句可以创建的最大动态分区个数
hive.exec.max.created.files100000全局可以创建最大文件数

单个查询语句中创建表并加载数据

CREATE TABLE ca_employees
AS SELECT name, salary, adress
FROM employees
WHERE se.state = 'CA';

这个功能常用于从一个大的宽表中选取部分需要的数据集

导出数据

hadoop fs -cp source_path target_path

或者

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salsry, adress
FROM employees
WHERE se.state = 'CA';

可以指定多个输出文件夹目录的:

FROM staged_employees se
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
	SELECT *  WHERE se.cty = 'US' and se.st = 'OR';
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
    SELECT *  WHERE se.cty = 'US' and se.st = 'CA';
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
	SELECT *  WHERE se.cty = 'US' and se.st = 'IL';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值