5.1 向管理表中装载数据
load data local inpath '${env:HOME}/california-employees'
overwrite into table employees
partition(country = 'US',State = 'CA')
用户指定overwrite 关键字,目标文文件家中之前存在的数据将会被先删除掉。如果没有该关键字,仅仅会把新增的文件追加到目标文件中。
通常情况下指定的路径应该是一个目录,而不是某个单独的文件
load data local … 拷贝本地数据到位于分布式文件系统上的目标位置。
load data … 转移数据到目标位置。
hive 要求源文件和目标文件以及目录应该在同一个文件系统中,所以用户不可以使用load data 语句将数据从一个集群的 hdfs 转载到另一个集群的hdfs
如果目标是分区表需要使用PARTITION子句,用户还必须为每个分区的键指定一个值。
INPATH子句使用的文件路径不可以包含任何文件夹
eg: 上面的语句中的数据会保存到
hdfs://master_server/user/hive/warehouse/mydb.db/employees/country=US/state=CA
hive 不会验证用户装载的数据和表模式是否匹配。然而,hive会验证文件格式是否和表结构定义的一致。 表创建时为SEQUENCEFILE 那么转载进去的文件应该是同样格式。
5.2 通过查询语句向表中插入数据
insert overwrite table employees
partition(country = 'US',State = 'OR')
select * from staged_employees se
where se.cnty = 'US' and se.st = 'OR'
使用overwrite 关键字,词之前分区中内容会被覆盖。没有overwtirte只是吧结果追加到原来的表中
动态分区插入
若创建非常多的分区,用户需要写非常多的SQL
INSERT OVERWRITE TABLE employees
partition(country,state)
select ...,se.cnty,se,st
from staged_employees se;
hive 根据select 语句中最后两列来确定分区字段 country 和state的值,可以使源表字段值和输出分区值之间的关系根据位置而不是根据命名来匹配。
用户可以混合使用静态分区和动态分区,但是静态分区必须出现在动态分区前。
insert overwrite table employees
partition (country = 'US',state)
select ...,se.cnty,se.st
from staged_employees se
where se.cnty = 'US'
默认下动态分区没有开启,有助于因设计错误导致查询产生大量分区。
5.3 单个查询语句中创建表并加载数据
create table ca_emplyees
as select name, salary, address
from employees
where se.state = 'CA';
5.4 导出数据
如果数据文件恰好是用户需要的格式,直接拷贝
hadoop fs -cp source_path tatget_path
否则使用insert…directory…
insert overwrite local directory '/tmp/ca_employees'
select name,salary ,address
from employees
where se.state = 'CA'
这里的路径可以写成全URL路径(hdfs://master-server/tmp/ca_employees)
在hive CLI中查看结果文件内容:
hive> ! ls /tmp/ca_employees
000000_0
hive> ! cat /tmp/oayroll/00000_0
用户也可以通过如下方式指定多个输出文件夹目录