浅谈hive
hive
支持sql标准的数据仓库,可以将sql语句转化成mr程序执行。基础分析一般用hive来做,比较复杂的用mr来做
数据仓库和数据库的区别
数据仓库:历史数据,面向分析,保证数据的完整性可以允许数据冗余。
数据库:存储结构化,在线数据,面向业务,使用范式来减少冗余。
hive中有解析器,编译器,优化器。hive最终会将sql语句转成mr程序(select * from 表 除外,消耗时间过长所以不转mr)
hive中也是有表的结构,来处理结构化数据,hive的元数据存储在关系型数据库(默认derby)中,元数据指表的名字、表的列和分区及其属性(是否为外部表)、表的数据所在目录等
架构
Driver:解析器,编译器(将hql转成很多操作符(树状结构),操作符是hive的最小单元,每个操作符表示对hdfs操作或者mr任务),优化器
常用操作符:select operator(查找),tablescan operator(扫描),limit(限制输出),file output operator(文件输出)。
hive的解析是通过antlr进行解析的,生成一个语法树生成上面的策略
将HQL转成一个抽象的语法树,然后再转成一个查询块,接着转成逻辑计划并重写逻辑计划,再将逻辑计划转成物理计划(mr任务,可能有多个),最终从多种物理计划中选择最佳策略
元数据库:存放元数据,需要用到元数据信息执行从这里拿
Thrift:跨语言跨平台的socket通讯组件,可以进行跨语言跨平台的数据交互,支持多种序列化和反序列化,MetaStoreServer模式中hive客户端和MetaStoreServer通讯就是用Thrift组件
Hadoop:hive解析成mr程序后提交给Hadoop进行执行
三种模式(根据元数据存储的位置来划分)
本地模式(测试)
元数据存放在derby数据库(hive自带)中,在同一台中
单用户模式
元数据存放在自己选的数据库中,笔者这里用mysql,hive直接从MySQL中获取元数据。
只允许一个hive客户端来访问MySQL,如果两个hive元数据都放在MySQL中,没有组件对元数据进行管理,两个hive同时操作会出问题
多用户模式
元数据存放在MySQL中,hive客户端通过MetaStoreServer来从MySQL中获取元数据(多个hive客户端操作一份元数据),采用Thrift协议。
由MetaStoreServer来管理元数据信息,多个hive通过MetaStoreServer来拿元数据,MetaStoreServer会通过访问的顺序来返回
安装(依赖Hadoop的环境变量,启动Hadoop)
安装之前需要查看和Hadoop版本:http://hive.apache.org/downloads.html,笔者这里采用的是2.3.4版本
1.本地模式
cp conf/hive-env.sh.template conf/hive-env.sh
添加HADOOP_HOME=/opt/hadoop-2.7.5
cp conf/hive-default.xml.template conf/hive-site.xml
<configuration>
<property>
<!--连接数据库的地址:数据库derby,数据库名称metastore_db,是否需要创建数据库-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<property>
<!--驱动包-->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<!--是否使用hive本地来管理元数据,一定是true-->
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<!--hive对应HDFS的数据目录-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
初始化derby数据库
bin/schematool -dbType derby -initSchema
进入hive
bin/hive
2.单用户模式(依赖MySQL)
cp conf/hive-env.sh.template conf/hive-env.sh
添加HADOOP_HOME=/opt/hadoop-2.7.5
cp conf/hive-default.xml.template conf/hive-site.xml
<configuration>
<property>
<!--HDFS中真实数据目录,空目录或不存在-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<!--hive本地管理元数据-->
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<!--指定文件数据库url,用于存放元数据。格式jdbc:mysql://地址/库?库不存在自动创建-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node3:3306/hive_remote?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>123456</value>
</property>
</configuration>
添加mysql启动jar包,mysql-connector-java-5.1.32-bin.jar到hive的lib中
启动Hadoop
初始化MySQL数据库
bin/schematool -dbType mysql -initSchema
进入hive
bin/hive
可以在MySQL中看到TBLS表就是来存放hive表的元数据信息,COLUMNS_V2是列的元数据
3.多用户模式
1)remote一体
配置MetaStoreServer和hive客户端放在一起
cp conf/hive-env.sh.template conf/hive-env.sh
添加HADOOP_HOME=/opt/hadoop-2.7.5
cp conf/hive-default.xml.template conf/hive-site.xml
<configuration>
<property>
<!--HDFS真实存放数据的目录,空目录或不存在-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<!--存放元数据地址,hive_remote库为空或者不存在-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node3:3306/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<!--驱动包-->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!--MySQL用户名-->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<!--MySQL密码-->
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<!--不启动本地hive管理元数据功能-->
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<!--MetaStoreServer的地址端口-->
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
</configuration>
添加mysql启动jar包,mysql-connector-java-5.1.32-bin.jar到hive的lib中
启动Hadoop
初始化MySQL数据库
bin/schematool -dbType mysql -initSchema
启动MetaStoreServer
bin/hive --service metastore
启动hive
bin/hive
2)remote分开
1、配置MetaStoreServer
cp conf/hive-env.sh.template conf/hive-env.sh
添加HADOOP_HOME=/opt/hadoop-2.7.5
cp conf/hive-default.xml.template conf/hive-site.xml
<configuration>
<property>
<!--HDFS真实存放数据的目录,空目录或不存在-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<!--存放元数据地址,hive_remote数据库一定保证空或者不存在-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node3:3306/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<!--驱动包-->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!--mysql用户名-->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<!--mysql密码-->
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
</configuration>
MetaStoreServer节点添加mysql启动jar包,mysql-connector-java-5.1.32-bin.jar到hive的lib中
启动Hadoop
初始化MySQL数据库
bin/schematool -dbType mysql -initSchema
启动MetaStoreServer
bin/hive --service metastore
2、hive客户端配置
cp conf/hive-env.sh.template conf/hive-env.sh
添加HADOOP_HOME=/opt/hadoop-2.7.5
cp conf/hive-default.xml.template conf/hive-site.xml
<configuration>
<property>
<!--HDFS真实存放数据的目录,空目录或不存在,和MetaStoreServer保持一致-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<!--不启动本地hive管理元数据功能-->
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<!--MetaStoreServer的地址端口-->
<name>hive.metastore.uris</name>
<value>thrift://node2:9083</value>
</property>
</configuration>
启动hive
bin/hive
Beeline
hive2中提出,用来管理hive属性的设定,和之前使用方式一样的
在Hadoop的hdfs-site.xml和core-site.xml文件中分布添加
hdfs-site.xml
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
core-site.xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
按照上述过程安装后在MetaStoreServer节点启动hiveServer2,如果有metastore则需要启动
bin/hiveserver2
hive客户端
bin/beeline(这时只是打开了beeline窗口并没有连接到MetaStoreServer节点)
连接上MetaStoreServer节点的hiveserver2
beeline>!connect jdbc:hive2://MetaStoreServer_IP:10000
然后填写用户,可以填root,因为之前Hadoop的数据是在root用户下创建的。密码为空可直接回车
默认不启动验证,配置文件中hive.server2.authentication默认为NONE
或者
bin/beeline -u jdbc:hive2://MetaStoreServer_IP:10000/库 -n user -w password_file(没有密码去掉-w password_file)
beeline提供jdbc方式访问
例如:(导入commons-lang-2.62,guava-14.0.12,hive-common-2.3.42,hive-jdbc-2.3.42,hive-serde-2.3.42,hive-service-2.3.42,hive-service-rpc-2.3.42,httpclient-4.42,httpcore-4.42,libthrift-0.9.32,slf4j-api-1.7.102的jar包)
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
Connection con = DriverManager.getConnection("jdbc:hive2://node1:10000/default", "root", "");
Statement stmt = con.createStatement();
String sql = "select * from psn";
ResultSet res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1));
}
}
HQL(官网->Language Manual)
数据类型
复合类型array_type(定义方式array<类型>),map_type(定义方式map<key类型,value类型>),struct_type(结构体)
基本类型tinyint,smallint,int,bigint,boolean,float,double,string
hive中表分为内部表和外部表
外部表:数据存放在指定的HDFS路径中,即使执行了删除表命令,但是hdfs上数据不会删除,只是删除了元数据
内部表:数据存放在hive配置文件所指定的位置中,执行删除表命令,元数据和hdfs数据都会删除
DDL数据定义语言(对数据库表创建、删除、修改等操作)
创建数据库
create (database|schema) [if not exists] database_name
[comment database_comment]
[location hdfs_path]
[with dbproperties (property_name=property_value, ...)];
删除数据库
drop (database|schema) [if exists] database_name [restrict|cascade];(当前不可以在需要删的库内)
使用数据库
use database_name;
创建表(不指定库会在default库中创建)
create [external] table [if not exists] [db_name.]table_name
[(col_name data_type [comment col_comment],...)]
[comment table_comment]
[partitioned by (col_name data_type [comment col_comment],...)]
[[row format row_format]
row format delimited [fields terminated by char [escaped by char]]
[collection items terminated by char]
[map keys terminated by char]
[lines terminated by char]
[null defined as char]
[stored as file_format]]
[location hdfs_path]
含义
external指定内部表还是外部表,不写默认内部表。如果是外部表需要指定location关键字
[db_name.]指定库
col_name字段名
data_type数据类型
col_comment对字段的描述
table_comment对表的描述
partitioned by(注意partitionby的顺序)按照哪些列(这些列不能在前面出现过的)做分区处理,可以对不同场景的数据进行分开管理
col_name列名
data_type数据类型
comment可选的描述
row_format对行做格式化或者规定序列化和反序列化规则,不指定就用hive默认的规则来做,hive操作的是hdfs上数据所以需要row_format。
比如:hdfs上数据为1,xiaoming,man,book-shejian-shoot,beijing:wudaokou-huoxing:weizhi,一条结构化数据要映射到hive中需要为它标识以什么做分割为哪一列哪一个数据。
fields terminated by char指定字段和字段之间的分隔符
escaped by char指定分割的类型,默认char类型
collection items terminated by char指定复合类型array_type里面数据的切分方式
map keys terminated by char指定复合类型map_type里面数据的切分方式
lines terminated by char指定每行数据的分隔符,默认/n
null defined as char指定什么字符为空值
file_format指定数据存储在hdfs中的文件类型,默认文本类型(也可以做压缩等)
location指定表为外部表时加上设置存放表数据的hdfs路径
例如一:通过delimited关键字指定分隔符的方式(hive中已经写好的序列化和反序列化的规则)创建一张表
create table psn (id int,name string,sex string,likes array<string>,address map<string,string>)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';
例如二:通过serde关键字指定序列化和反序列化的方式来创建一张表,这样可以自定义序列化和反序列化的规则
create table psn2
row format serde "org.apache.hadoop.hive.serde2.columnar.columnarserde"
stored as rcfile
as
select * from psn;
参照psn表的元数据来创建psn2表(就是两张表的schema一样),并且将as后面的语句所查询的数据放到psn2中
例如三:通过like关键字来创建表
create table table_name2
like table_name
根据table_name表的元数据来创建table_name2表,两个表的schema相同
删除表
drop table table_name;
截断表,将表中数据清空
truncate table table_name
修改表,
语法和关系型数据库一样
添加分区
alter table table_name add partition (dt='2008-08-08', country='us') 根据分区字段来添加具体的值而已,不会添加分区字段
删除分区(分区中的数据也会跟着删除掉,而且该分区下的所有分区也会删除)
alter table table_name drop partition (dt='2008-08-08')
视图和关系型数据库中一样,一般数据库不能对视图插入数据
DML数据操作语言
插入数据(load方式和insert)
load:load data [local] inpath 'filepath' [overwrite] into table tablename [partition (partcol1=val1, partcol2=val2 ...)]
local如果需要上传的文件在hdfs上不用加,如果在本地需要加上(它会先将本地文件上传到HDFS然后再加载到指定分区目录中)
filepath文件路径
overwrite是否覆盖
partition如果创建表的时候使用了分区,那么导入的时候需要加上,而且分区个数要对应
partcol1=val1分区字段名和分区字段所指定的值
insert方式插入的速度很慢一般不会使用,但是一般如果需要将结果存到临时表中会用insert
比如:from table_name 别名
insert into table table_name1
select 别名.col1,别名.col2,别名.col3
或:from table_name 别名
insert into table table_name1
select 别名.col1,别名.col2,别名.col3
insert table table_name2
select 别名.col1,别名.col2,别名.col3
如果要覆盖之前的数据,将into换成overwrite
查询
select * from table_name where partcol1=val1(根据分区来查找)
修改数据
update tablename set column = value [, column = value ...] [where expression]
删除数据
delete from tablename [where expression]
正则表达式(官网->Getting Started Guide->Apache Weblog Data)
比如
create table apachelog (
host string,
identity string,
user string,
time string,
request string,
status string,
size string,
referer string,
agent string)
row format serde 'org.apache.hadoop.hive.serde2.regexserde' 接的是正则表达式的标准类
with serdeproperties (
"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
stored as textfile;
hive内置函数
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF或链接:https://pan.baidu.com/s/1o26fIzJtTF-kqaDiufvqSQ 提取码:b5dl
自定义函数
UDF一进一出,进入一条数据返回一条数据
UDAF多进一出
UDTF一进多出,复杂类型会用到UDTF
例如:自定义的UDF实现转小写(类继承UDF类重写evaluate方法,类型必须是Hadoop中类型并且结合业务来定)
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}
打jar包,将jar包放到MetaStoreServer节点
然后在hive客户端上执行hive>add jar jar包路径 上传jar包。
创建临时函数,在hive客户端执行hive>create temporary function 自定义函数名称(随意起) as 'hive.udf.add(程序的类入口)';
测试
select id,name,tm(sex) from psn;
删除自定义函数hive> drop temporary function 自定义函数名称;
hive优化,链接:https://pan.baidu.com/s/10jVPjYTTecGFPWyJv57Qhg 提取码:9aih
浅谈hive的更多相关文章
- [转]浅谈Hive vs. HBase 区别在哪里
浅谈Hive vs. HBase 区别在哪里 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=No ...
- 浅谈Hive vs HBase
Hive是什么? Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,注意这里不是数据库.Hive可以看作是用户编程接口,它本身不存储和计算数据:它依赖于HDFS(H ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
随机推荐
- vm虚拟机进入boot manager解决
今天用vm创建了一个虚拟机,进入系统时却直接进入了boot manager,重新创建几回都不管用 于是查了下,有两种方式: 方法1.进入vm,虚拟机设置,选项,高级,固件类型,选择BIOS 参考链接: ...
- ArcGIS工具 - 导出空数据库
有时,需要根据已有的成果数据创建一个空的数据库模板文件,用于新的编辑或对外发布.那么,如果又快又好的创建呢?为源GIS为您编写了一个导出空数据库工具,它可以实现"一键"快速导出任意 ...
- python之路25 面向对象 封装(隐藏、伪装)、多态、反射
派生方法实战演练 import json import datetime d = { 't1': datetime.date.today(), 't2': datetime.datetime.toda ...
- salesforce零基础学习(一百二十四)Postman 使用
本篇参考: Salesforce 集成篇零基础学习(一)Connected App salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesfo ...
- day05-Spring管理Bean-IOC-03
Spring管理Bean-IOC-03 2.基于XML配置bean 2.15bean的生命周期 bean对象的创建是由JVM完成的,然后执行如下方法: 执行构造器 执行set相关方法 调用bean的初 ...
- SICTF_wp
misc 签到打卡完成 附加下载完成之后可以看到是qsnctf的公众号 使用010打开附件 可以发现key,去公众号回复key即可获得flag SICTF{fb23cefd-487f-42dd-a34 ...
- angular + ng-zorro 表格后台分页及排序功能实现,angular + ng-zorro 表格排序不起作用解决办法
angular + ng-zorro 表格排序不起作用是因为数据是从后端获取的,也是后端分页,所以要自己写排序啦~~~~ 举例:HTML <nz-table #basicTable nzBord ...
- webpack动态配置多静态资源路径,动态配置多上线路径,配置less,多种图片引用方式----"webpack": "^4.41.6",
1.项目场景是有两个静态资源目录,一个用于开发,一个用于发布,上线多个版本,打包多个版本后,也要部署到同一个服务器的同一个端口下. 根据我自己的摸索,我搞出来了下面的配置,自感觉还蛮好用的 先看我的c ...
- C# 学习async/await(个人理解)
await : 等待的意思 async:异步(非同步) 当我们方法内部 存在await的时候,就返回出去 执行下一步 ,等await后面的方法执行完毕 在执行await下面的方法 一.我们先看正常 ...
- 线程私有变量ThreadLocal详解
本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 烈火试真金,逆境试强者.--塞内加 目录 什么是ThreadLocal ThreadLo ...