目录

安装mysql、hive步骤

什么是hive

一、启动方式

二、操作Hive

1、基本建表语句:

2、内部表与外部表

3、分区表

4、数据导入与导出


安装mysql、hive步骤

一、什么是hive

Hive是基于Hadoop的一个数据仓库工具(离线),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

操作接口采用类SQL语法,提供快速开发的能力, 避免了去写MapReduce,减少开发人员的学习成本, 功能扩展很方便。

用于解决海量结构化日志的数据统计。

本质是:将 HQL 转化成 MapReduce 程序

1、优缺点

  优点:1)  操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。

      2)  避免了去写 MapReduce,减少开发人员的学习成本。

      3)  Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。

      4)  Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。(不断地开关JVM虚拟机)

      5)  Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

   缺点:  1.Hive 的 HQL 表达能力有限

                   (1)迭代式算法无法表达    (反复调用,mr之间独立,只有一个map一个reduce,反复开关)

                   (2)数据挖掘方面不擅长

              2.Hive 的效率比较低

                   (1)Hive 自动生成的 MapReduce 作业,通常情况下不够智能化

                   (2)Hive 调优比较困难,粒度较粗   (hql根据模板转成mapreduce,不能像自己编写mapreduce一样精细,无法控制在map处理数据还是在reduce处理数据)

2、架构原理

hive java 调用 hive如何使用_hive java 调用

二、启动方式

需要先启动hdfs和yarn,hive数据最终保存在hdfs,操作表需要mr,所以需要yarn资源调度

1、方式一:

[root@hdp-2 lib]# hive

设置一些基本参数,让hive使用起来更便捷,比如:

//让提示符显示当前库:

hive>set hive.cli.print.current.db=true;

//显示查询结果时显示字段名称:

hive>set hive.cli.print.header=true;

但是这样设置只对当前会话有效,重启hive会话后就失效,解决办法:

在linux的当前用户目录中~,编辑一个.hiverc文件,将参数写入其中:

vi .hiverc

set hive.cli.print.header=true;
set hive.cli.print.current.db=true;

2、方式二:

在hdp-1服务器端启动hivesever2    (1)停在这个页面

[root@hdp-1 conf]# hiveserver2

启动hivesever2    (2)信息打印输出台

[root@hdp20-04 hive-1.2.1]# bin/hiveserver2 -hiveconf hive.root.logger=DEBUG,console

启动hivesever2    (2)后台启动

hiveserver2 1>/dev/null 2>&1 &

在其他机器,客户端连接hdp-1            beeline只是一个客户端,实际操作的是hivesever2的机器

方式1

[root@hdp-4 apps]# beeline 
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hdp-1:10000
Connecting to jdbc:hive2://hdp-1:10000
Enter username for jdbc:hive2://hdp-1:10000: root
Enter password for jdbc:hive2://hdp-1:10000: 
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hdp-1:10000>

方式2

[root@hdp-2 bin]# beeline -u jdbc:hive2://hdp-1:10000 -n root
Connecting to jdbc:hive2://hdp-1:10000
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.2.1 by Apache Hive
0: jdbc:hive2://hdp-1:10000>

3、另外,hive提供一次性命令的方式来执行给定的hql语句

[root@hdp20-04 ~]#  hive -e "insert into table t_dest select * from t_src;"

因为这一机制,hive可以使用脚本、文件执行大量sql语句

(1)脚本,运行脚本

#!/bin/bash
hive -e "select * from db_order.t_order"
hive -e "select * from default.t_user"
hql="create table default.t_bash as select * from db_order.t_order"
hive -e "$hql"

(2)文件

    vi x.hql

select * from db_order.t_order;
select count(1) from db_order.t_user;

执行文件:hive -f /root/x.hql 

4、启动 Hive 时,可以在命令行添加-hiveconf param=value 来设定参数    此操作效果一次性

hive  -hiveconf mapred.reduce.tasks=10

查看和修改参数设置:

hive (default)> set mapred.reduce.tasks;         //查看
hive (default)> set mapred.reduce.tasks=10;         //修改

设定方式的优先级:配置文件<命令行参数<参数声明

三、操作Hive

hive中有一个默认的库:  default         在分布式文件系统中看不到以defalut为名字的数据库

新建库:create database db_order;

库建好后,在hdfs中会生成一个库目录:hdfs://hdp20-01:9000/user/hive/warehouse/db_order.db

1、基本命令

use school;
create table teacher(id string,name string,gender string);
desc teacher;  //查看表结构

#过滤显示查询的数据库
show databases like 'db_hive*';

#显示数据库信息
desc database db_hive;

#显示数据库详细信息
desc database extended db_hive;

#修改设置数据库dbproperties信息,其他无法修改
alter database school set dbproperties('yongtu'='practice');

#删除空数据库
drop database if exists db_hive2;

#数据库不为空需要强制删除
drop database if exists temp cascade;

建表语句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]

(1)COMMENT:为表和列添加注释。
(2)PARTITIONED BY 创建分区表
(3)CLUSTERED BY 创建分桶表

(4)STORED AS 指定存储文件类型:SEQUENCEFILE(二进制序列文件,压缩)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
(5)LOCATION :指定表在 HDFS 上的存储位置。
(6)LIKE 允许用户复制现有的表结构,但是不复制数据。

这样建表的话,hive会认为表数据文件中的字段分隔符为 ^A

指定字段分隔符:

create table teacher(id string,name string,gender string)
row format delimited
fields terminated by ',';

效果:

hive java 调用 hive如何使用_hive java 调用_02

按照分割格式,可以将数据内容从本地上传到hdfs表的路径内,hive自动生成表数据

vi testdata.dat
1,lucas,male
2,nimoo,female
3,jack,male
//上传hdfs
hadoop fs -put testdata.dat /user/hive/warehouse/school.db/teacher

CTAS建表

(1)复制表结构:

create table t_user_2 like t_user;

(2)复制表结构以及数据(分区不会被复制,并且分区就会被当做列)

create table t_access_user 
as
select ip,url from t_access;

2、修改表

#修改表名
ALTER TABLE table_name RENAME TO new_table_name;

#更新列,修改列名
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name
column_type [COMMENT col_comment] [FIRST|AFTER column_name]

#增加和替换列,替换则把所有列都替换,从第一列开始替换,如果替换列<原有列,则不显示后面数据,不#过数据不会删除,后续添加列数据还会显示
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type[COMMENT col_comment], ...)

#删除表
drop table student;

#插入数据,有分区要先指定分区
insert into table ipc partition(month='202004',day='07') (address,name) values('192.162.002','lisi');

#覆盖数据,指定分区数据会被覆盖,必须包含所有列数据
insert overwrite table ipc partition(month='202004',day='07') values('192.162.002','lisi',30);

#插入他表的数据
insert overwrite table ipc partition(month='202004',day='06') select * from ipc_copy;

#删除表数据,不删除结构
truncate table student;

2、内部表与外部表

(1)创建表的时候,有external修饰的是外部表,否则是内部表

(2)内部表的数据是Hive自身管理,外部表数据由HDFS管理;

(3)内部表存储在hdfs的/user/hive/warehouse路径,外部表可以指定任何位置

(4)删除内部表会删除元数据(metadata)及存储数据,外部表仅仅会删除元数据,HDFS上的文件并不会被删除

(5)元数据存储着表的基本信息,增删改查记录,类似于Hadoop架构中的namespace。普通数据就是表中的详细数据。
       hive的元数据默认存储在derby中,但大多数情况下存储在MySQL中。普通数据如架构图所示存储在hdfs中。

(6)创建外部表:

create external table t_access(ip string,url string,access_time string)
row format delimited
fields terminated by ','
location '/access/log';

内部表外部表转换:

#内——>外
alter table tblName set tblproperties('EXTERNAL'='TRUE');

#外——>内
alter table tblName set tblproperties('EXTERNAL'='FALSE');

#查询表的类型
(1) desc formatted student2;查看详细信息
Table Type:             MANAGED_TABLE   -->内部表
(2) describe extended tablename;

3、分区表

分区表的创建是通过在Create Table语句中加入Partitioned by字句实现,一个分区表可以有一个或多个分区列,对于不同的分区,会创建一个对应的目录,用于存放分区表内容。

分区表的实质是:Hive 中的分区就是分目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读取数据的范围。

1、创建分区表(动态、静态)

create table t_access(ip string,url string,access_time string)
partitioned by(dt string)
row format delimited
fields terminated by ',';

注意:分区字段不能是数据表中已存在的字段。

hive java 调用 hive如何使用_hive java 调用_03

向分区表中加载数据

load data local inpath '/root/access.log.2017-08-04.log' into table t_access partition(dt='20170804');

根据分区查询数据:

select count(*) from t_access where dt='20170804';
##实质:就是将分区字段当成表字段来用,就可以使用where子句指定分区了

多个分区字段:

建表:

create table t_partition(id int,name string,age int)
partitioned by(department string,sex string,howold int)
row format delimited fields terminated by ',';

加载数据:

load data local inpath '/root/p1.dat' into table t_partition partition(department='xiangsheng',sex='male',howold=20);

4、数据导入与导出

(1)数据文件导入hive

         load data local inpath -->inpath指的是启动hivesever2的机器路径

方式1:导入数据的一种方式:
手动用hdfs命令,将文件放入表目录;
(1) hadoop fs -put ...
(2)从hive中提交数据
hive> dfs -put /opt/module/datas/student.txt /user/hive/warehouse/student5;
此方法加载分区表数据后需要修复表,否则查询不到数据   msck repair table tableName;

方式2:在hive的交互式shell中用hive命令来导入本地数据到表目录(服务器地址)
hive>load data local inpath '/root/order.data.2' into table t_order;

方式3:用hive命令导入hdfs中的数据文件到表目录
hive>load data inpath '/access.log.2017-08-06.log' into table t_access partition(dt='20170806');

方式4:从hdfs上import数据
import table student2 partition(month='201709')
from
'/user/hive/warehouse/export/student';

注意:导本地文件和导HDFS文件的区别:
      本地文件导入表:复制              hdfs文件导入表:移动

(2)hive表数据导出(overwrite会把之前文件夹内所有文件都删除)

#1、将hive表中的数据导出HDFS的文件
insert overwrite directory '/root/access-data'
row format delimited fields terminated by ','
select * from t_access;

#2、将hive表中的数据导出本地磁盘文件
insert overwrite local directory '/root/access-data'
row format delimited fields terminated by ','
select * from t_access limit 100000;

#3、hadoop命令导出数据
dfs -get
/user/hive/warehouse/school.db/ipc/month=202004/day=07/000000_0
/root/data/hive/test.txt

#4、hive shell命令导出
hive  -e  'select  *  from
default.student;' >
/opt/module/datas/export/student4.txt;

#5、export数据到hdfs,导出位置要是空的文件夹
export table ipc to '/data/hive/ipc';