Hive其四,Hive的数据导出,案例展示,表类型介绍

目录

一、Hive的数据导出

1)导出数据到本地目录

2)导出到hdfs的目录下

3)直接将结果导出到本地文件中

二、一个案例

三、表类型

1、表类型介绍

2、内部表和外部表转换

3、两种表的区别

4、练习


一、Hive的数据导出

数据导出的分类:

  1. 从hive表中导出本地文件系统中(目录、文件)

  2. 从hive表中导出hdfs文件系统中

  3. hive表中导出到其它hive表中

1)导出数据到本地目录

复制代码
insert overwrite local directory '/root/out/00' select * from t_user;

这个00不是文件名,而是文件夹的名字,没有可以自动创建

2)导出到hdfs的目录下

复制代码
insert overwrite directory '/root/out/00' select * from t_user;

假如你导出的数据想要一个分隔符,比如 逗号

复制代码
insert overwrite directory '/root/out/00' 
row format delimited fields terminated by ','
select * from t_user;

3)直接将结果导出到本地文件中

复制代码
hive -e "sql语句"   不需要进入hive,直接执行hive的语句
hive -e "select * from  databaseName.t_user" >> /root/out/a.txt
hive -e "use databaseName;select * from  t_user" >> /root/out/a.txt

制表符就是 Tab 键,Tab 键就是 \t

二、一个案例

数据整理:emp.txt

复制代码
7369,SMITH,CLERK,7902,1980-12-17,800,null,20
7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02,2975,null,20
7654,MARTIN,SALESMAN,7698,1981-09-28,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01,2850,null,30
7782,CLARK,MANAGER,7839,1981-06-09,2450,null,10
7788,SCOTT,ANALYST,7566,1987-04-19,3000,null,20
7839,KING,PRESIDENT,null,1981-11-17,5000,null,10
7844,TURNER,SALESMAN,7698,1981-09-08,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23,1100,null,20
7900,JAMES,CLERK,7698,1981-12-03,950,null,30
7902,FORD,ANALYST,7566,1981-12-02,3000,null,20
7934,MILLER,CLERK,7782,1982-01-23,1300,null,10
3423,cfxj,MANAGER,8899,2022-01-01,50000,100000,40

根据数据的字段和格式,建表:

复制代码
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int
)
row format delimited 
fields terminated by ',';

加载数据:

复制代码
load data local inpath "/home/hivedata/emp.txt" into table emp;

编写指标:

复制代码
1、统计有领导的员工有哪些?
不完美
select * from emp where mgr is not null;
完美的写法:
select * from emp e1 where exists (select * from emp e2 where e2.empno = e1.mgr);

还有其他写法:
select * from emp where mgr in (select distinct empno from emp);

2、统计每个部门的员工的总工资和总薪水是多少?
select sum(sal),sum(comm+sal),deptno from emp group by deptno;

8750    NULL    10
10875   NULL    20
9400    7800    30
50000   150000  40
Time taken: 1.965 seconds, Fetched: 4 row(s)

null + 任何数字 结果为null
需要一个函数 IFNULL(mysql中的函数),在hive中的对应的函数是nvl
select sum(sal),sum(nvl(comm,0)+sal),deptno from emp group by deptno;

Hive中的函数是非常重要的,课下多留意,积累!

三、表类型

1、表类型介绍

内部表:

表面来看,我们建的所有的表,默认都是内部表,内部表又叫做管理表,它的位置也很固定/user/hive/warehouse下面。

外部表:

创建的时候需要加关键字external 修饰,而且,外部表它的数据的存储位置可以不在/user/hive/warehouse,可以指定位置。

建表的语法格式:

复制代码
 create external table tableName(id int,name string) [location 'path'];

举例:

复制代码
create external table t_user7(
id int,
name string
)
row format delimited
fields terminated by ','
location '/publicData'

这个location 是本地的意思还是hdfs的路径呢?答案是必须在hdfs上。

2、内部表和外部表转换

内部表转外部表

复制代码
desc extended t_user; 查看表结构的详细信息

|-----------------------------------------------------------------------------------|
| alter table tableName set tblproperties('EXTERNAL'='TRUE'); 注意:内部表转外部表,true一定要大写; |

外部表转内部表

|----------------------------------------------------------------------------|
| alter table tableName set tblproperties('EXTERNAL'='false'); 说明:false不区分大小 |

3、两种表的区别

用的最多的都是外部表 ,因为可以分析数据(OLAP)。

OLAP: 为分析而生的数据库 A(分析)

OLTP: 存储数据,保证数据的安全。 T(事务的意思)

最大的区别就是删除表的时候,内部表会删除元数据和真正的hdfs上的数据。而外部表只删除元数据。

思考:为什么这么做?

Hive是一个数据分析的工具,存储数据不是它的本意。

假如一个人,将数据上传至hdfs,这个数据量很大,一般不挪动位置,你可以建一个外部表数据的位置指向hdfs的某个文件夹,然后就可以分析了。

/home a.txt 2G

建一个外部表,指向/home/a.txt , 分析完毕之后,删除表就可以了,干嘛要删除数据,没必要。--用后即焚!

微信小程序--> 阅后即焚。

  1. 内部表和外部表在创建时的差别

就差两个关键字,EXTERNAL 和 LOCATION 举例:

|--------------------------------------------------------------------------------------------------------------------|
| - 内部表 -- CREATE TABLE T_INNER(ID INT); - 外部表 -- CREATE EXTERNAL TABLE T_OUTER(ID INT) LOCATION 'HDFS:///AA/BB/XX'; |

  1. Hive表创建时要做的两件事:

1、在hdfs下创建表目录

2、在元数据库mysql创建相应表的描述数据(元数据)

  1. drop时有不同的特性:

1、drop时,元数据都会被清除

2、drop时,内部表的表目录会被删除,但是外部表的表目录不会被删除。

  1. 使用场景

内部表: 平时用来测试或者少量数据,并且自己可以随时修改删除数据.

外部表:使用后数据不想被删除的情况使用外部表(推荐使用)所以,整个数据仓库的最底层的表使用外部表。

4、练习

复制代码
创建不存在的文件夹  
hdfs dfs -mkdir -p /user/hdfs/source/out_table
接着创建一个外部表
create external table out_table (
   id int,
   name string
)
row format delimited
fields terminated by ','
location '/user/hdfs/source/out_table';

加载数据:load data local inpath '/home/hivedata/user.txt' into table out_table;

查看数据存放的位置:

复制代码
drop table out_table;

发现数据依然存在:

假如我再创建一个表,数据指向这个文件夹,表中是否会有数据?

复制代码
create external table student (
   sid int,
   sname string
)
row format delimited
fields terminated by ','
location '/user/hdfs/source/out_table';

查看表数据,数据即可出现,根本不需要导入操作

相关推荐
计艺回忆路2 小时前
Hive自定义函数(UDF)开发和应用流程
hive·自定义函数·udf
万能小锦鲤16 小时前
《大数据技术原理与应用》实验报告三 熟悉HBase常用操作
java·hadoop·eclipse·hbase·shell·vmware·实验报告
天翼云开发者社区1 天前
数据治理的长效机制
大数据·数据仓库
王小王-1231 天前
基于Hadoop与LightFM的美妆推荐系统设计与实现
大数据·hive·hadoop·大数据美妆推荐系统·美妆商品用户行为·美妆电商
一切顺势而行1 天前
hadoop 集群问题处理
大数据·hadoop·分布式
万能小锦鲤2 天前
《大数据技术原理与应用》实验报告七 熟悉 Spark 初级编程实践
hive·hadoop·ubuntu·flink·spark·vmware·实验报告
项目題供诗2 天前
Hadoop(二)
大数据·hadoop·分布式
Leo.yuan2 天前
ETL还是ELT,大数据处理怎么选更靠谱?
大数据·数据库·数据仓库·信息可视化·etl
万能小锦鲤2 天前
《大数据技术原理与应用》实验报告五 熟悉 Hive 的基本操作
hive·hadoop·ubuntu·eclipse·vmware·实验报告·hiveql
張萠飛2 天前
flink sql如何对hive string类型的时间戳进行排序
hive·sql·flink