Hive学习笔记 (二)

一、Hive深入使用

Hive学习笔记 (二)_第1张图片 

1.  Hive中数据库Database基本操作

创建数据库

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name

  [COMMENT database_comment]

  [LOCATION hdfs_path]

  [WITH DBPROPERTIES (property_name=property_value, ...)];

create database IF NOT EXISTS db_hive_01;

 

create database IF NOT EXISTS db_hive_02

LOCATION '/user/zhuyu/hive/warehouse/db_hive_02.db';(指定数据库存放位置)

Hive学习笔记 (二)_第2张图片

Hive学习笔记 (二)_第3张图片

查看数据库:

Hive学习笔记 (二)_第4张图片


删除数据库:

 

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

 

(注意:假如手动去HDFS上删除数据库或表的文件夹,在hive中依旧是可以查到的,但是数据是没有的。并且下次加载数据时,会自动创建)



2.  Hive中表的创建及常见的三种创建表的方式及应用

 

方式一:创建原始表

create table IF NOT EXISTS default.bf_log_20180107

(

ip string COMMENT 'remote ip address',

username string,

req_url string COMMENT 'user request url'

)

COMMENT 'BeiFeng Web Access Logs'

ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '

STORED AS TEXTFILE

LOCATION '/user/zhuyu/hive/warehouse/bf_log_20180107';(指定表的存储位置)

Hive学习笔记 (二)_第5张图片
 

加载数据:

Hive学习笔记 (二)_第6张图片

Hive学习笔记 (二)_第7张图片 

方式二:根据原始表创建子表

原始数据表数据量教大,我们只需要其中某几个字段,那么我们可以把那些字段抽取到一个表里进行处理,这样数据量就小了,处理速度就快了。

create table IF NOT EXISTS default.bf_log_20180107_sa

AS select ip,req_url from bf_log_20180107;

Hive学习笔记 (二)_第8张图片

Hive学习笔记 (二)_第9张图片

Hive学习笔记 (二)_第10张图片

Hive学习笔记 (二)_第11张图片


方式三:克隆表结构

当数据量较大时,将每天的数据存储到一个新的结构相同的表。

create table IF NOT EXISTS default.bf_log_20180108

LIKE default.bf_log_20180107;

Hive学习笔记 (二)_第12张图片



3 Hive的数据类型讲解及实际项目中如何使用phthon脚本对数据进行ETL

Hive学习笔记 (二)_第13张图片



4.  以【雇员表和部门表】为例创建讲解Hive中表的操作

Hive学习笔记 (二)_第14张图片

create table IF NOT EXISTS default.emp(

empno int,

ename string,

job string,

mgr int,

hireddate string,

sal double,

comm double,

deptno int

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

load data local inpath '/root/emp.txt' overwrite into table default.emp;

create table IF NOT EXISTS default.dept(

deptno int,

dname string,

loc string

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

load data local inpath '/root/dept.txt' overwrite into table default.dept;

Hive学习笔记 (二)_第15张图片
Hive学习笔记 (二)_第16张图片

(注意:数据格式一定要是UTF-8否则会出错)


Hive学习笔记 (二)_第17张图片



5.  Hive中外部表的讲解(对比管理表)

 Hive学习笔记 (二)_第18张图片

企业中百分之80都是外部表。


Hive学习笔记 (二)_第19张图片

删除外部表时,只会删除mysql中的元数据,而你location的文件夹和文件不会删除。

 

如何查看是内部表还是外部表

Hive学习笔记 (二)_第20张图片

 

创建外部表:

create EXTERNAL table IF NOT EXISTS default.emp_ext(

empno int,

ename string,

job string,

mgr int,

hireddate string,

sal double,

comm double,

deptno int

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

LOCATION '/user/zhuyu/hive/warehouse/emp_ext';

( 默认的都存储在/user/hive/warehouse/;一般直接指定到日志文件所在的文件夹,不需要导入数据,例如:/hdfs/weblogs )

load data local inpath '/root/emp.txt' overwrite into table default.emp_ext;

( 把txt文件直接放到location指定的目录也可以 )


Hive学习笔记 (二)_第21张图片


应用场景:

搞网站的,每天把网站日志放在指定目录,如下图:

Hive学习笔记 (二)_第22张图片

如果多个部门都需要使用,则需要复制到本部门的文件夹下,这样就造成日志份数有好几份,多余了如下图:

Hive学习笔记 (二)_第23张图片



6.  Hive中分区表讲解

Hive学习笔记 (二)_第24张图片

Hive学习笔记 (二)_第25张图片


创建分区表:

create table IF NOT EXISTS default.emp_partition(

empno int,

ename string,

job string,

mgr int,

hireddate string,

sal double,

comm double,

deptno int

)

PARTITIONED BY(month string)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

Hive学习笔记 (二)_第26张图片


加载数据到分区表:

load data local inpath '/root/emp.txt' overwrite into table emp_partition partition(month='201801');

Hive学习笔记 (二)_第27张图片


查看某个表的所有分区:

Hive学习笔记 (二)_第28张图片 

查询某个分区的数据:

Hive学习笔记 (二)_第29张图片 

 

实例:

统计日志文件中某几个月的ip个数:

select count(DISTINCT ip) from log_partition where month='201711'

UNION

select count(DISTINCT ip) from log_partition where month='201712'

UNION

select count(DISTINCT ip) from log_partition where month='201801';

总共5mapreduce:三个查询+两个union

一般都放在hive脚本中执行:



二级分区:

Hive学习笔记 (二)_第30张图片


注意:

非分区表,把数据直接放到表下,select能查出来数据。而分区表,在表目录下创建分区字段文件夹(例:month=201801文件夹),将数据放到该文件夹中,select查不出来数据。

Hive学习笔记 (二)_第31张图片

Hive学习笔记 (二)_第32张图片

Hive学习笔记 (二)_第33张图片

为什么?

因为分区是要保存到元数据中的,而你手动创建分区文件夹,手动将数据放进去,并没有生产分区的元数据。

mysql中的hive数据库中的partition表中:

Hive学习笔记 (二)_第34张图片


解决方法:

方式一:修复表(不常用)

Hive学习笔记 (二)_第35张图片

Hive学习笔记 (二)_第36张图片


方式二:添加分区

alter table emp_partition add partition(month=201712)

而且这种方式经常在脚本中使用:


每天的日志都会像这样:1.创建分区目录2.将当天的日志文件添加到所创建分区目录中3.添加分区


查看一个表的分区数:

Hive学习笔记 (二)_第37张图片 


7.  导入数据进入Hive表的六大方式

Hive学习笔记 (二)_第38张图片

Hive学习笔记 (二)_第39张图片

Hive学习笔记 (二)_第40张图片



8.  导出Hive表数据的几种方式


方式一:不指定格式

insert overwrite local directory '/root/hive_exp_emp'
select * from emp;

Hive学习笔记 (二)_第41张图片

方式二:指定格式

insert overwrite local directory '/root/hive_exp_emp'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

select * from emp;

Hive学习笔记 (二)_第42张图片

方式三:hive命令导出

bin/hive -e "select * from emp;" > /root/exp_res.txt

Hive学习笔记 (二)_第43张图片

 

方式四:将数据导入HDFS上,再从HDFSget

insert overwrite directory '/user/zhuyu/hive/hive_exp_emp'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

select * from emp;

Hive学习笔记 (二)_第44张图片

引出:

Hive学习笔记 (二)_第45张图片

 


9.  Hive中常见的查询

Hive学习笔记 (二)_第46张图片

Hive学习笔记 (二)_第47张图片






(全连接=左连接+右连接)

 

 

10.  Hive中数据导入导出ImportExport的使用

mysql数据库中的导入导出类似

Hive学习笔记 (二)_第48张图片

Hive学习笔记 (二)_第49张图片


导出:

 export table default.emp to '/user/zhuyu/hive/export/emp_exp';

Hive学习笔记 (二)_第50张图片

Hive学习笔记 (二)_第51张图片

Hive学习笔记 (二)_第52张图片

Hive学习笔记 (二)_第53张图片


导入:

create table db_hive.emp like default.emp;

import table db_hive.emp from '/user/zhuyu/hive/export/emp_exp/emp.txt'

Hive学习笔记 (二)_第54张图片

Hive学习笔记 (二)_第55张图片


所有导入、导出实例:

Hive学习笔记 (二)_第56张图片 


11.  Hiveorder bysortbydistribute bycluster by

Hive学习笔记 (二)_第57张图片


order by:

Hive学习笔记 (二)_第58张图片

Hive学习笔记 (二)_第59张图片



sort by:

Hive学习笔记 (二)_第60张图片

Hive学习笔记 (二)_第61张图片

Hive学习笔记 (二)_第62张图片

Hive学习笔记 (二)_第63张图片

 

distribute by:

Hive学习笔记 (二)_第64张图片 

cluster by:

Hive学习笔记 (二)_第65张图片  


12.  Hive中自带Function使用及自定义UDF编程及使用


一个公司的自定义函数达到上百个,上千个。

 

自带函数的查看及使用:

Hive学习笔记 (二)_第66张图片


自定义函数:

Hive学习笔记 (二)_第67张图片

Hive学习笔记 (二)_第68张图片

Hive学习笔记 (二)_第69张图片

 

创建maven项目并添加依赖

       <dependency>

            <groupId>org.apache.hadoopgroupId>

            <artifactId>hadoop-clientartifactId>

            <version>2.7.4version>

       dependency>

 

       <dependency>

            <groupId>org.apache.hivegroupId>

            <artifactId>hive-jdbcartifactId>

            <version>2.2.0version>

       dependency>

 

       <dependency>

            <groupId>org.apache.hivegroupId>

            <artifactId>hive-execartifactId>

            <version>2.2.0version>

       dependency>


写定义一个类继承UDF并实现evaluate方法

Hive学习笔记 (二)_第70张图片

Hive学习笔记 (二)_第71张图片

main方式只是测试用,最终调用的是evaluate方法。

可添加描述信息,以供desc查看:

Hive学习笔记 (二)_第72张图片


打成jar

Hive学习笔记 (二)_第73张图片 

使用FileZilla放到linux系统下

Hive学习笔记 (二)_第74张图片

 

进入hive CLI创建UDF

方法一:

hive > add  jar  jar包路径

hive > create  function  函数名  as  “包中类的全名

Hive学习笔记 (二)_第75张图片


方法二:

首先将jar包上传到hdfs

create function self_lower AS 'com.zhuyu.senior.hive.udf.LowerUDF' using jar 'hdfs://hadoop-senior:8020/user/zhuyu/hive/jars/hiveudf.jar';

Hive学习笔记 (二)_第76张图片




 

你可能感兴趣的:(Hive学习笔记 (二))