hive-1.2.2
Hive是基于hadoop的一个数据仓库工具,可以将结构化数据文件映射为一张数据库表,并提供类SQL查询功能,
Hive本质就是将HQL转换成MapReduce程序
Hive建立在Hadoop的其他组件之上
Hive依赖HDFS进行数据存储
Hive依赖MapReduce完成查询操作
其主要用途是用来做离线数据分析,比直接用mr开发效率更高
数据库和数据仓库的区别:
Hive转mr的过程:
Hive的优缺点:
Hive安装模式:
内嵌模式:在不修改任何配置的情况下,在本机通过默认的元数据数据库管理,hive有自带的derby数据库,在首次启动hive的时候需要进行初始化数据,因为有一些默认的表结构和默认的数据库。初始化命令:bin/schematool -initSchema -dbType derby,初始化成功后会在当前执行命令的目录下生产metastore_db文件夹。在任意目录下执行${HIVE_HOME}/bin/hive命令会进入hive shell窗口,同时也会在当前目录下重新生成metastore_db,无法做到数据共享(在此之前需要启动hdfs)(derby只能单用户操作)
本地模式:改变元数据的存放位置(数据共享,多用户操作,速度还行),主要是将元数据存储到mysql中,这样可以再任意路径下执行hive命令达到数据共享:修改配置文件hive-site.xml,将连接mysql的jar加入lib目录下,可以再任意目录下执行bin/schematool -initSchema -dbType derby初始化hive生成的元数据全部写入mysql中
远程模式:hive服务和metastore在不同的进程内,可以时不同的机器
CAP原则(定理):在一个分布式系统中,一致性consistency,可用性availability,分区容错性partition,三者不可兼得
ETL:抽取extract、转换transform、装载load
BI:商业智能Business Intelligence
hive的架构:
hive的数据倾斜:
hive的数据类型:
基本数据类型:一般情况下只存储一个值
集合类型:可以存储多个值,常用的有三类,Array、Map、Struct、Union
hql分类
ddl:数据定义语言,建表,修改表,删表,分区,数据类型
dml:数据操纵语言,数据导入,数据导出
dql:数据查询语言
创建db:
- CREATE DATABASE IF NOT EXISTS db1 COMMENT 'desc' WITH DBPROPERTIES ('name'='desc'); =>对应在hdfs的存储位置/user/hive/warehouse/db1.db
- CREATE DATABASE IF NOT EXISTS db2 COMMENT 'desc' LOCATION '/external/hdfs/hive/db' WITH DBPROPERTIES ('name'='desc'); =>对应在hdfs的存储位置/external/hdfs/hive/db/db1.db =>对应hdfs的存储位置/external/hdfs/hive/db
创建table
- CREATE TEMPORARY EXTERNAL TABLE DB.TABLE_NAME(COLUMN_NAME DATA_TYPE COMMENT 'desc',...);
- create EXTERNAL table t3(name string comment 'people name',likes ARRAY<string>,cards MAP<string,string>,address STRUCT<province:string,city:string>) COMMENT 'desc' LOCATION '/external/hdfs/hive/table'; =>/external/hdfs/hive/table
TEMPORARY:临时表,在hive中进行统计的时候经常会用到一些中间表,只存在于当前会话中
EXTERNAL:外部表,默认表为内部表|托管表|管理表,通过desc formatted 表名查看
在创建表时如果没有指定分隔符的话,装在数据时会将一行的内容全部给第一个字段,其他的字段都为NULL
将某一个数据库下的表导出到hdfs中
export table t34 to '/hdfs/t'
备份
export table t34 from '/hdfs/t'
hive可以安装在任意一台机器上,前提是需要该台机器有hadoop的安装包,且环境变量中配置HADOOP_HOME
配置hive环境变量
vim ~/.bash_profile
source ~/.bash_profile
export HIVE_HOME=/home/hadoop/hive/apache-hive-1.2.2-bin
${HIVE_HOME}/bin
启动hadoop
启动hive
显示所有数据库
show databases;
显示所有表
show tables;
创建表t_1,并使用逗号作为属性分词
create table t_1(id int,name string,add string) row format delimited fields terminated by ',';
查询表数据
select * from t_1;
创建表t_1就相当于在hdfs上创建一个/user/hive/warehouse/t_1文件夹,其中这种表创建方式会默认在/user/hive/warehouse/下新建表名,表t_1使用的数据库为默认default,而默认default数据库的目录是/user/hive/warehouse/
hive命令
创建数据库db_1
create database db_1;
显示所有数据库
show databases;
使用db_1数据库
use db_1;
创建表t_2,并使用空格作为属性分词
create table t_2(id int,price double) row format delimited fields terminated by ‘ ’;
显示所有表
show tables;
查看表详情
desc t_1;
创建表t_2就相当于在hdfs上创建一个/user/hive/warehouse/db_1.db/t_2文件夹,
其中db_1.db是因为t_2表是在数据库db_1中创建的
上传文件到/user/hive/warehouse/t_1目录下
hdfs dfs -put t1.data /user/hive/warehouse/t_1
使用默认数据库
use default;
查询表数据
select * from t_1;
select add,count(*) from t_1 group by add;
metastore_db为hive的元数据信息,其创建的路径取决于在哪里运行hive命令
修改配置文件hive-site.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.2.113:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>passwd</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
再次使用hive命令启动会报下错,原因是hive的lib目录下缺少mysql驱动包
加入mysql驱动包后再次运行hive命令
执行hive语句报错及其解决办法
报错如下:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)
在mysql数据库中执行如下sql语句:
ALTER database hive CHARACTER set latin1;
修改编码后再次创建,成功
后台服务启动hive,占用端口10000
nohup hiveserver2 & 将hive作为后台服务启动
netstat -nltp查看端口占用情况
查看hiveserver2的java进程
jps -l
客户端访问hive,beeline就是hive的客户端
beeline 使用beeline客户端连接hive
!connect jdbc:hive2://slave1:10000 连接hive,用户名root,密码空
修改hiverserver2 端口
hiverserver2 --hiveconf hive.server2.thrift.port=14000
通过脚本批量执行hive命令
vi test.sh 编写脚本
#!/bin/bash
hive -e "insert into t_1 values(5,'jj','wx');select * from t_1;"
sh test.sh 运行脚本
hive的ddl操作
建立内部表
create table t_2(id int,name string,salary bigint,add string) row format delimited fields terminated by ',';
建立外部表
create external table t_3(id int,name string,salary bigint,add string) row format delimited fields terminated by ',' location '/aa/bb';
区别:内部表的目录由hive创建在默认的仓库目录下,/user/hive/warehouse/
外部表的目录由用户建表时通过location指定
drop一个内部表时,表的元信息和表数据目录都会被删除
drop一个外部表时,只删除表的元信息,而表数据目录不会被删除
意义:通常一个数据仓库系统,数据总有一个源头,而源头一般是别的应用系统产生的,其目录无定法,为了方便映射,就可以在hive中用外部表进行映射,并且,就算在hive中把这个表给drop掉,也不会删除hdfs数据目录,也不会影响到别的应用系统
如果所有处理都有hive来完成建议使用 managed table
如果要用hive和其他工具来处理同一个数据集,应该使用external table
多重插入
fromt t_4
insert overwrite table t_1 partition(day='1')
select ip,url,staylong where staylong < 200
insert overwrite table t_2 partition(day='2')
select ip,url,staylong where staylong > 200;
导入数据
将hive运行所在机器的本地磁盘文件导入表中
load data local inpath '/root/user.data.1' into/overwrite table t_1;
local inpath是hive运行的那台机器上的路径
into/overwrite 追加/覆盖
将hdfs中的文件剪切到表中
load data inpath '/root/user.data.1' into table t_1;
从别的表中查询后得到的数据插入到一张新建表中
create table t_1_jz as select * from t_1;
从别的表中查询后得到的数据插入到一张已存在的表中
insert into table t_1_hb select id,name,add from t_1 where add = 'wh';
导出数据
将数据从hive的表中导出到hdfs的目录中
insert overwrite directory '/aa/bb' select * from t_1 where add = 'wh';
将数据从hive的表中导出到本地磁盘中
insert overwrite local directory '/aa/bb' select * from t_1 where add = 'wh';
hive的存储文件格式
SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE
create table t_seq(id int,name string,add string) stored as sequencefile;
分区
创建分区表
create table t_part(id int,name string) partitioned by (day string) row format delimited fields terminated ',';
显示表的所有分区
show partitions t_part;
插入一条数据
insert into table t_part partition(day='2013-14-520') values(1,'dmq');
给表增加分区,原表必须是分区表
alter table t_part add partition(day='2017-04-10') partition(day='2017-04-11');
往分区中导入数据
load local inpath '/root/data' into table t_part partition(day='2017-04-11');
insert into table t_part parition(day='2017-04-11') select id,name from t_4 where staylong > 30;
删除分区
alter table t_part drop partition(day='2017-04-11');
分桶
比分区还要细的一个数据分类
基于表的
create table ttt(name string,age int) clustered by(name) into 20 buckets;
基于分区的
create table tttt(name string,age int) partitioned by (sex int) clustered by(name) into 10 buckets;
修改表
修改表名
alter table t_part rename to t_pp;
增加表字段
alter table t_part add columns (sex string,date string);
完全替换表字段
alter table t_part replace columns (sex string,date string);
修改字段
alter table t_part change sex xingbie string;
显示命令
show databases;
show tables;
show partitions t_part;
show functions;
desc t_part;
desc extended t_part;
desc formatted t_part;
复杂数据解析
hive之java API操作
private String driverName = "org.apache.hive.jdbc.HiveDriver";
private String url = "jdbc:hive2://192.168.218.135:10000/db1";
private String username = "root";
private String password = "";
private Connection connection;
private Statement statement;