本文是学习时的自我总结,用于往后温习。若有错误还望谅解,不吝赐教java
1、安装方式(内嵌模式,本地模式远程模式)python
安装环境以及前提说明:mysql
Hive是依赖于hadoop系统的,所以在运行Hive以前须要保证已经搭建好hadoop集群环境。linux
本例中使用的hadoop版本为2.6.1,Hive版本为2.1.1版。程序员
1.Hive的3种安装方式:web
1)内嵌模式(元数据保存在内嵌的derby种,容许一个会话连接,尝试多个会话连接时会报错)正则表达式
2)本地模式(本地安装mysql 替代derby存储元数据)sql
3)远程模式(远程安装mysql 替代derby存储元数据)数据库
2.内嵌模式参数:apache
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/usr/local/hive/bin/metastore_db;create=true</value>
描述了hive元数据存储的位置
3.Mysql的几个操做
1)查询平台自己的Mysql版本和安装的MySQL是不是同一个版本,不一致要删除旧的数据库
2)安装缺乏的两个rpm包:libaio 和 perl。联外网(虚拟机要桥接到外网,配置外网后若是ping IP可行,ping域名不行,则须要把ifcfg-eth0复制一份拷贝到dns中)或下载后拷贝到服务器
3)按项目规模选择合适的配置文件
①my-small.cnf是为了小型数据库而设计的。不该该把这个模型用于含有一些经常使用项目的数据库。
②my-medium.cnf是为中等规模的数据库而设计的。若是你正在企业中使用RHEL,可能会比这个操做系统的最小RAM需求(256MB)明显多得多的物理内存。因而可知,若是有那么多RAM内存可使用,天然能够在同一台机器上运行其它服务。
③my-large.cnf是为专用于一个SQL数据库的计算机而设计的。因为它能够为该数据库使用多达512MB的内存,因此在这种类型的系统上将须要至少1GB的RAM,以便它可以同时处理操做系统与数据库应用程序。
④my-huge.cnf是为企业中的数据库而设计的。这样的数据库要求专用服务器和1GB或1GB以上的RAM。
这些选择高度依赖于内存的数量、计算机的运算速度、数据库的细节大小、访问数据库的用户数量以及在数据库中装入并访问数据的用户数量。随着数据库和用户的不断增长,数据库的性能可能会发生变化。
4)考虑安全问题要对root用户设置密码并删除空用户;建立一个普通用户,并给普通用户赋予localhost和%(远程)的权限;为普通用户建立一个数据库
5)查看权限和更新权限
SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='hive';
6)初始化MySQL数据库
schematool -dbType mysql -initSchema
4.本地模式参数
1)<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value>
为Hive建立的访问MySQL的用户的库空间
2)<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
MySQL的JDBC驱动(须要把mysql的驱动包放到目录 <HIVE_HOME>/lib 中)
3)<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
为Hive建立的访问MySQL的用户
5.远程模式须要配置那些文件
1)配置环境变量:/.bashrc
2)配置Hadoop和Hive的路径:hive-env.sh
3)hive-default.xml.template --> hive-site.xml
4) hive.server2.thrift.port– TCP 的监听端口,默认为10000。
hive.server2.thrift.bind.host– TCP绑定的主机,默认为localhost
5)启动
hive --service metastore &
hive --service hiveserver2 &
2、Hive
1. 什么是Hive
是创建在Hadoop基础上的数据仓库基础架构。能够用来进行数据提取转化加载(ETL),这是一种能够存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为QL,相似于SQL语句。同时,这个语言也容许熟悉 MapReduce 开发者的开发自定义的mapper和reducer来处理内建的mapper和 reducer 没法完成的复杂的分析工做。
Hive 是 SQL解析引擎,它将SQL语句转译成Map/Reduce Job而后在Hadoop执行。
Hive的表其实就是HDFS的目录,按表名把文件夹分开。若是是分区表,则分区值是子文件夹,能够直接在Map/Reduce Job里使用这些数据。
2. Hive实现WordCount
create external table word_data(line string) row format delimited fields terminated by '\n' stored as textfile location '/home/hadoop/worddata';
3.Java链接Hive查询表信息
public class HiveTest {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static ResultSet res;
public static void main(String[] args) throws Exception {
Class.forName(driverName);//加载驱动
Connection conn = DriverManager.getConnection(
"jdbc:hive2://192.168.111.219:10000/default", "hive", "123456");//创建链接
Statement stmt = conn.createStatement();//声明
res = stmt.executeQuery("select * from userinfo");//用声明stmt对象下的executeQuery方法查询
while (res.next()) {
System.out.println(res.getInt(1) + "\t" + res.getString(2));
}
res.close();
stmt.close();
conn.close();
}
}
4.Hive支持的数据类型
1)基本数据类型:数值类型、布尔型和字符串(TIMESTAMP、BINARY)
TINYINT 1字节 有符号整数
SMALLINT2字节 有符号整数
INT 4字节 有符号整数
BIGINT 8字节 有符号整数
FLOAT 4字节 单精度浮点数
DOUBLE 8字节 双精度浮点数
2)复杂数据类型:ARRAY、MAP 和 STRUCT
5.Hive的数据类型转换
1)隐式类型转换的规则:
任何整数类型能够隐式地转换为一个范围更广的类型。
全部整数类型、FLOAT 和 STRING 类型都能隐式转换为 DOUBLE。
TINYINT、SMALLINT 和 INT 均可以转换为 FLOAT。
BOOLEAN 类型不能转换为其余任何类型。
TIMESTAMP 能够被隐式转换为 STRING。
2)显示数据类型转换(CAST)
例如,CAST(‘1’ AS INT) 把字符串’1’转换成整数值 1。
6.内表和外表
EXTERNAL 关键字可让用户建立一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)。
Hive 建立内部表时,会将数据移动到数据仓库指向的路径;若建立外部表,仅记录数据所在的路径,不对数据的位置作任何改变。在删除表的时候,内部表的元数据和数据会被一块儿删除,而外部表只删除元数据,不删除数据。
11.Hive的三种启动方式
1) hive 命令行模式
进入hive安装目录,输入bin/hive的执行程序,或者输入 hive –service cli
用于linux平台命令行查询,查询语句基本跟mysql查询语句相似
2) hive web界面的启动方式
bin/hive –service hwi (& 表示后台运行)
用于经过浏览器来访问hive,感受没多大用途,浏览器访问地址是:127.0.0.1:9999/hwi
3) hive 远程服务 (端口号10000) 启动方式
bin/hive –service hiveserver2 &(&表示后台运行)
用java,python等程序实现经过jdbc等驱动的访问hive就用这种起动方式了,这个是程序员最须要的方式
2、数据库
1.hive会为每一个数据库建立一个目录。数据是库中的表将会以这个数据库目录的子目录形式存储。
有一个例外就是default数据中的表,由于这个数据库自己没有本身的目录。
数据库全部的目录位于属性hive.metastore.warehouse.dir所指定的顶层目录以后。
用户能够经过以下命令来修改这个默认的位置
create database financials location '/my/preferred/directory';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON hive.* TO hive@'%' identified by '123456';
FLUSH PRIVILEGES;
3、数据类型举例
一、建表命令
CREATE TABLE employee(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)
row format delimited fields terminated by '\001'
collection items terminated by '\002'
MAP KEYS terminated by '\003'
LINES terminated by '\n'
stored as textfile;
二、查看表结构:describe employee;
三、导数据:load data local inpath '/root/employees.txt' into table employee;
四、查询表内容
SELECT * FROM employee;
SELECT name ,salary FROM employee;
SELECT name , subordinates[0] FROM employee;
SELECT name , deductions["State Taxes"] FROM employee;
SELECT name , address.city FROM employee;
4、建表方式
1.直接创建表
2.指定表空间创建表
CREATE TABLE mydb.employee(
name STRING,
subordinates ARRAY<STRING>)
row format delimited fields terminated by '\001'
collection items terminated by '\002'
LINES terminated by '\n'
stored as textfile;
3.复制表结构创建新表(LIKE)
CREATE TABLE IF NOT EXISTS copy_employee LIKE employee;
4.复制指定表字段结构及数据并创建表(AS SELECT)
CREATE TABLE copy_part_employee AS SELECT name,subordinates from employee;
5、加载数据
1.从本地加载数据到表中:load data local inpath '/root/employees.txt' into table employee;
从HDFS中加载数据到表中:load data inpath '/test/employees.txt' OVERWRITE into table employee;
2.从原有的表employee中追加数据到表copy_employee:
insert INTO table copy_employee select * from employee
从原有的表employee中加载数据到表copy_employee,并替换掉原来的数据
insert OVERWRITE table copy_employee select * from employee;
3.建立表的时候经过select加载数据:
create table cr_employee as SELECT * from employee;
建立表的时候经过select 指定创建的字段并加载指定字段的数据
create table cr_employee1 as SELECT name from employee;
4.直接把与表结构相符的数据文件复制到表指定的存储位置
dfs -put /root/employees.txt /user/hive/warehouse/employee;
6、表操做
1.表重命名(RENAME TO):ALTER TABLE employee RENAME TO rm_emp;
2.修改列信息(CHANGE COLUMN对某个字段进行重命名,并修改其位置、类型或者注释):
ALTER TABLE employee CHANGE COLUMN
name rename STRING COMMENT 'The people name';
3.增长列(ADD COLUMNS在表的最后添加字段)
ALTER TABLE employee ADD COLUMNS(
addcol1 STRING COMMENT 'Application name',
addclo2 INT COMMENT 'The current session id');
4.删除列或者替换列(REPLACE COLUMNS替换原来全部的字段)
ALTER TABLE employee REPLACE COLUMNS(
rename STRING COMMENT 'name to rename',
resalary FLOAT COMMENT 'salary to resalary',
resub ARRAY<STRING> COMMENT 'subordinates to resub');
8、分区和分桶、视图
1. 分区:
所谓分区(Partition) 对应于数据库的 Partition 列的密集索引。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,全部的 Partition 的数据都存储在对应的目录中。
有时候只须要扫描表中关心的一部分数据,所以建表时引入了partition概念。
分区表指的是在建立表时指定的partition的分区空间。一个表能够拥有一个或者多个分区,每一个分区以文件夹的形式单独存在表文件夹的目录下。
分区是以字段的形式在表结构中存在,经过describetable命令能够查看到字段存在,可是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)
2. 分桶
桶是更为细粒度的数据范围划分。
Hive采用对 列值哈希 除以 桶的个数 求余 的方式决定该条记录存放在哪一个桶当中
优势:得到更高的查询处理效率;使取样(sampling)更高效。
3. 视图
和关系数据库中的视图一个概念,能够向用户集中展示一些数据,屏蔽一些数据,提升数据库的安全性。
9、Hive中order by、sort by、distribute by、cluster by的区别
order by对输入作全局排序,只有一个reducer(多个reducer没法进行全局),输入规模较大时,须要较长的计算时间。与数据库的区别在于必须指定limit,由于数据量大时也只在一台服务器上,会出现没法输出结果的状况,进行limit,就只有n*map number条记录,一个reduce也能够处理
sort by在数据进入reducer前排序,sort by只保证同一reduce中的数据能够按指定字段排序
distribute by按照指定的字段对数据进行划分到不一样的输出reduce/文件中
cluster by具备distribute by和sort by的功能,可是排序只能是倒排
10、Hive在建表时,能够经过'STORED AS FILE_FORMAT' 指定存储文件格式。有如下几种:
1)将数据按行分块,保证同一个record在一个块上,避免读一个记录须要读取多个block;
2)块数据列式存储,有利于数据压缩和快速的列存取。查询效率最高、存储空间最小、但加载最慢。
11、Sqoop = Sql to Hadoop
sqoop import
--connect jdbc:mysql://localhost/hadoopguide #jdbc链接字符串
--table widgets #读取的表名
-m 1 map #任务的个数
--target-dir /widgets #hdfs目标路径
3. Sqoop导出命令的含义
sqoop export --connect jdbc:mysql://localhost/hadoopguide -m 1 --table sales_by_zip --export-dir /user/hive/warehouse/zip_profits --input-fields-terminated-by '\0001'
--connect mysql链接字符串
-m mapreduce的个数
--table 代表
--export-dir 导出路径
--input-fields-terminated-by 输入字段的分割字符