转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88384371
向管理表中装载数据
load data local inpath '${env:HOME}/california-employees'
overwrite into table employees
pritition (country='US', state='CA');
如果分析目录不存在的话,这个命令会先创建分区目录,然后再将数据拷贝到该目录下。
如果目标表是非分区表,则应该省略partition子句。
通常情况下指定的路径应该是一个目录,而不是单独的文件。
inpath 子句是使用的文件路径中不可以包含任何文件夹
Hive并不会验证用户装载的数据和表的模式是否匹配,然后,Hive会验证文件格式是否和表结构定义的一致。例如,如果在创建时定义的存储格式是sequencefile,那么装载进去的文件也应该是sequencefile格式的才行。
通过查询向表中插入数据
insert overwrite table employees
partition (country='US', state='OR')
select * from staged_employees se
where se.cnty = 'US' and se.st = 'OR';
为3个州创建表employees分区:
from staged_employees se
insert overwrite table employees
partition (country='US', state='OR')
select * where se.cnty = 'US' and se.st = 'OR'
insert overwrite table employees
partition (country='US', state='CA')
select * where se.cnty = 'US' and se.st = 'CA'
insert overwrite table employees
partition (country='US', state='IL')
select * where se.cnty = 'US' and se.st = 'IL'
通过使用这个结构,源表中的某些数据可以被写入目标表的多个分区中或者不被写入任一个分区中。
动态分区插入
动态分区,可以基于查询参数推断出需要创建的分区名称。
例如:
insert overwrite table employees
partition (country, state)
select ..., se.cnty, se.st
from staged_employees se;
Hive根据select语句中最后2列来确定分区字段country和state的值,源表字段值和输出分区值之间的关系是根据位置而不是根据命名来匹配的。
可以混合使用动态和静态分区。如下这个例子中指定了country字段的值为静态的US,而分区字段state是动态值:
insert overwrite table employees
partition (country = 'US', state)
select ..., se.cnty, se.st
from staged_employees se
where se.cnty = 'US';
静态分区必须出现在动态分区之前。
动态分区功能默认情况下没有开启。开启后,默认是以“严格”模式执行的,这种模式要求至少有一列分区字段是静态的。
动态分区属性:
属性名称 缺省值 描述
hive.exec.dynamic.partition false 设置成true,表示开启动态分区功能
hive.exec.dynamic.partition.mode strict 设置成nonstrict,表示允许所有分区都是动态的
hive.exec.max.dynamic.partitions.pernode 100 每个mapper或reducer可以创建的最大动态分区个数,如果某个mapper或reducer尝试创建大于这个值的分区的话则会抛出一个致命错误
hive.exec.max.dynamic.partitions +1000 一个动态分区创建语句可以创建的最大动态分区个数。如果超过这个值则会抛出一个致命错误信息
hive.exec.max.created.files 100000 全局可以创建的最大文件个数。有一个Hadoop计数器会跟踪记录创建了多少个文件,如果超过这个值则会抛出一个致命错误信息
比如:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
insert overwrite table employees
partition (country, state)
select ..., se.cnty, se.st
from staged_employees se;
单个查询语句中创建表并加载数据
可以在一个语句中完成创建表并将查询结果载入这个表的操作:
create table ca_employees
as select name, salary, address
from employees
where se.state = 'CA';
这个功能不能用于外部表。常见情况是从一个大的宽表中选取部分需要的数据集。
导出数据
如果数据文件恰好是用户需要的格式,只需要简单的拷贝文件夹或者文件就可以了:
hadoop fs -cp source_path target_path
还可以使用insert...directory...语句:
insert overwrite local directory '/tmp/ca_employees'
select name, salary, address
from employees
where se.state = 'CA';
不管在源表中数据实际是怎么存储的,Hive会将所有的字段序列化成衣服穿写入到文件中。Hive使用和Hive内部存储的表相同的编码方式来生成输出文件。
指定多个输出文件夹:
from staged_employees se
insert overwrite directory '/tmp/or_employees'
select * where se.cty='US' and se.st='OR'
insert overwrite directory '/tmp/ca_employees'
select * where se.cty='US' and se.st='CA'
insert overwrite directory '/tmp/il_employees'
select * where se.cty='US' and se.st='IL'