Hive(四)——数据操作
-
向管理表装载数据,指定路径应该是一个目录而非文件(load本地文件不会抛异常,hdfs则不可)
# 装载本地文件的数据使用local关键字,装载hdfs数据去掉local关键字即可 LOAD DATA LOCAL INPATH '${env:HOME}/california-employees' OVERWRITE INTO TABLE employees PARTITION (country = 'US', state = 'CA');
注意
:1、LOAD DATA LOCAL…拷贝
本地数据到位于分布式文件系统上的目标位置,而LOAD DATA …(也就是没有使用LOCAL)转移
数据到目标位置。 2、OVERWRITE关键字作用是覆盖装载,不写则追加装载数据(如果没有使用OVERWRITE关键字,而目标文件夹下已经存在同名的文件时,会保留之前的文件并且会重命名新文件为“之前的文件名_序列号”),例:hive.txt,hive_copy_1.txt
3、对于INPATH子句中使用的文件路径还有一个限制,那就是这个路径下不可以包含任何文件夹
-
通过查询语句向表中插入数据
FROM staged_employees se INSERT OVERWRITE TABLE employees # 此处不能加into关键字 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';
注意
:1、该语句能向不同的表插入数据,也能混合使用OVERWRITE或INTO 2、配合select使用意味着可以一部分字段存入新表
-
动态分区插入数据,可以混用动态及静态分区,下例指定静态country,动态state
INSERT OVERWRITE TABLE employees PARTITION (country = 'US', state) SELECT ..., se.cnty, se.st FROM staged_employees se WHERE se.cnty = 'US';
注意
:1、静态分区键必须出现在动态分区键之前 2、动态分区功能默认情况下没有开启。开启后,默认是以“严格”模式执行的,在这种模式下要求至少有一列分区字段是静态的。这有助于阻止因设计错误导致查询产生大量的分区
扫描二维码关注公众号,回复: 13147398 查看本文章作为例子演示,前面我们使用的第一个使用动态分区的例子看上去应该是像下面这个样子的
hive> set hive.exec.dynamic.partition=true; hive> set hive.exec.dynamic.partition.mode=nonstrict; hive> set hive.exec.max.dynamic.partitions.pernode=1000; hive> INSERT OVERWRITE TABLE employees > PARTITION (country, state) > SELECT ..., se.cty, se.st > FROM staged_employees se;
-
也可以在一个语句中完成创建表并将查询结果载入这个表的操作
CREATE TABLE ca_employees AS SELECT name, salary, address FROM employees WHERE se.state = 'CA';
注意
:这个功能不能用于外部表。可以回想下使用ALTER TABLE语句可以为外部表“引用”到一个分区,这里本身没有进行数据“装载”,而是将元数据中指定一个指向数据的路径 -
导出数据
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees' # 不加local则导出到hdfs SELECT name, salary, address FROM employees WHERE se.state = 'CA';
和向表中插入数据一样,用户也是可以通过如下方式指定多个输出文件夹目录的
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';