【HIVE】(1)建表、导入数据、外部表、导出数据
导入数据
1). 本地
load data local inpath "/root/example/hive/data/dept.txt" into table dept;
2). HDFSload data inpath "/user/hive/warehouse/functiontest.db/dept1/dept.txt" into table dept1;
我发现使用这个命令后,hdfs上的xxx.txt文件会移动到当前表的目录下,原来表的目录下xxx.txt没有了
create table dept1 like dept;
load data inpath "/user/hive/warehouse/functiontest.db/dept1/dept.txt" into table dept1;
0: jdbc:hive2://bigboss3:10000> load data inpath "/user/hive/warehouse/test01.db/emp/emp.txt" into table hdfsload;
No rows affected (0.74 seconds)
0: jdbc:hive2://bigboss3:10000> select * from hdfsload;
+--------------+----------------+---------------+---------------+--------------------+------------------+-----------------+------------------+
| hdfsload.id | hdfsload.name | hdfsload.job | hdfsload.mgr | hdfsload.hiredate | hdfsload.salary | hdfsload.bonus | hdfsload.deptid |
+--------------+----------------+---------------+---------------+--------------------+------------------+-----------------+------------------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.0 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-2-20 | 1600.0 | 300.0 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-2-22 | 1250.0 | 500.0 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-4-2 | 2975.0 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-9-28 | 1250.0 | 1400.0 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-5-1 | 2850.0 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-6-9 | 2450.0 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-4-19 | 3000.0 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.0 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-9-8 | 1500.0 | 0.0 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-5-23 | 1100.0 | NULL | 20 |
| 7900 | JAMAES | CLERK | 7698 | 1981-12-3 | 950.0 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-3 | 3000.0 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-1-23 | 1300.0 | NULL | 10 |
+--------------+----------------+---------------+---------------+--------------------+------------------+-----------------+------------------+
14 rows selected (0.247 seconds)
select * from dept1;
drop table dept1;
- 直接从本地导入;
- 将数据复制到数据默认目录,/user/hive/warehouse/table_name
- 从hdfs已有目录导入,建表时指定: location “hdfspath”;
- create like: 复制表结构;
- create as select: 复制表结构和数据;
- insert into select:表结构已存在,从select插入数据。
3). truncate table dept1;
// 清空表数据,drop是直接删除表
insert overwrite,into
create table dept1 like dept;
insert overwrite table dept1 select * from dept;
hdfs dfs -ls /user/hive/warehouse/functiontest.db/dept1
select * from dept1;
truncate table dept1; // 清空表数据,drop是直接删除表
select * from dept1;
insert into table dept1 select * from dept;
select * from dept1;
注意:对于非空表,不要进行insert,即不要将Hive拥有可修改的场景。非空表会新增hdfs文件,而不是在原数据文件中追加或修改。
4). CREATE … AS …
create table dept2 as select * from dept;
相当于:
create table dept1 like dept;
insert overwrite table dept1 select * from dept;
5). 外部表 LOCATION
create external table dept3 like dept location "/user/root/input/hive_external_data";
select * from dept3;
hdfs dfs -ls /user/hive/warehouse/functiontest.db/ //warehouse中没有数据
drop table dept3;
hdfs dfs -ls /user/root/input/hive_external_data // 查看外部数据还在
重点:管理表和外部表的区别
- 新建时,带external都是外部表,否则为管理(内部)表;
- 对于外部表,Hive在drop table时,不会删除数据,仅仅删除表结构(元数据);
- 为什么会出现这种情况:
* 在数据分析的时候,不仅仅是Hive分析,Hive尽量不要对原始数据做删除操作。
* 工作中,建议优先使用external表;
作业:新建外部表,然后删除表,查看数据是否存在。
导出数据
1). 常见导出
-- 使用overwrite关键字前一定要确保是空目录。因为如果原目录不空,则该目录下所有文件都会被覆盖掉。
* 导出到本地目录
insert overwrite local directory '' select * from emp_partition;
* 导出到HDFS目录
insert overwrite directory "/user/root/input/hive_external_data" select * from dept;
* hive -e "select * from ..." > /opt/datas/xx.txt
2). sqoop
Hadoop 和关系数据库服务器之间传送数据
这里知道有工具帮我们完成数据的导入、导出即可,我们当前重点还是在Hive的使用上:如何使用Hive做数据分析。
- EXPORT 和 IMPORT -- 数据迁移
* EXPORT命令将hive表数据和元数据导出到外部目录
* 其他Hadoop集群可以拷贝该目录,然后使用IMPORT将表结构和数据导入
hdfs dfs -mkdir /user/root/input/hive_export_data/
export table dept to "/user/root/input/hive_export_data/";
hdfs dfs -ls /user/root/input/hive_export_data/
hdfs dfs -cat /user/root/input/hive_export_data/_metadata
hdfs dfs -cat /user/root/input/hive_export_data/data/dept.txt
import table dept_import from "/user/root/input/hive_export_data/";
select * from dept_import;
Victory!