启动:
进入到apache-hive/bin目录中,sh hive启动hive
简介
命令
在hive中新建的库,在hdsf中对应的位置为:
表结构
一.外部表和内部表
创建外部表的时候,会依据/score路径下的一个score文件创建。
分区表
在向表中加载数据的时候,指定分区,那么每一个分区在HDFS上的表文件夹下都会对应一个目录。
手动添加分区:如果我在表目录下创建了一个分区目录,province=‘湖北’,如果想要这个分区生效,就需要执行以上命令
修复分区:如果需要手动添加多个分区的时候使用。
动态分区
多字段分区
前一个字段形成的目录会包含后一个字段形成的目录。在实际过程中,如果需要对数据进行多级分类的时候,考虑多字段分区。
案例:
分桶表
注意:只能insert添加数据,不能load添加
**注意:**根据后边的排序部分的知识可知,这里的clustered by 实际上是先进行了分区,然后distribute by将数据分桶,然后在sort by对数据排序。如果distribute by和sort by后边的字段相同的话,就可以简写成:clustered by。
数据类型和函数
一.数据类型
1.Hive中包含了2两大类数据类型:基本类型和复杂类型
2.基本类型包含:tinyint,smallint,int,bigint,boolean,float,double,string,timestamp,binary
3.复杂类型包含:array、map和struct类型
4.array类型-数组类型,对应的Java中的数组和集合
扩展
关于网站域名的介绍
在Hive中,如何提高查询效率?
分区查询
SQL语句优化:join where,使用子查询,先where再join
使用索引
使用视图,字段少了,查起来快
缓存 map side join,join的时候将小表放在内存中,查询大表的时候如果用到校表的数据从缓存中取
order by 和 limit一块用的时候可以提高效率
窗口函数
函数
这里regexp_extract函数中最后那个是捕获组的编号
捕获组
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。
explode
列转行
关于lateral view
lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
行转列
hive中函数的分类
函数的分类上看行数的变化,一行数据变成了一行这是UDF,一行数据变成了多行数据,这是UDTF,多行数据变成了一行,这叫UDAF
排序
orderby 和sortby正常使用时没有差别,但是如果对mapReduce进行了分区,效果就会不一样。对于orderby,分区前后排序效果不变,;对于sortby,分区后,一般都会有distribute by,按照指定字段的hash值进行分类,分到不同的桶中,在每个桶中数据是根据指定字段排序的。
分区:set mapred.reduce.tasks=3
join
Serde
案例:
原始数据:
beeline
view-视图
元数据
因为derby是单连接的,不支持并发,所以我们把derby换成MySQL
首先安装MySQL
-
查看是否有残缺的MySQL
rpm -qa | grep mysql -
卸载残缺的MySQL
rpm -ev --nodeps mysql-libs-5.1.73-8.el6_8.x86_64
rpm -ev --nodeps tcl-mysqltcl-3.052-1.el6.x86_64 -
添加用户组和用户
groupadd mysql
useradd -r -g mysql mysql -
下载安装包
wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm
wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm -
安装MySQL
rpm -ivh MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm
rpm -ivh MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm -
修改
vim /usr/my.cnf
添加
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES -
可以将MySQL添入开机自启
cp /usr/share/mysql/mysql.server /etc/init.d/mysql -
启动MySQL
service mysql start -
查看初始随机密码
cat /root/.mysql_secret -
修改启动密码
mysqladmin -u root -p password root
切换Hive的元数据库
- 进入Hive的安装目录的lib目录下
cd /home/software/apache-hive-1.2.0-bin/lib - 添加MySQL的连接驱动包
wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/mysql-connector-java-5.1.38-bin.jar - 进入Hive的安装目录的conf目录下
cd …/conf - 编辑
vim hive-site.xml
添加
javax.jdo.option.ConnectionURL jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword root - 进入MySQL执行如下命令
grant all privileges on . to ‘root’@‘hadoop01’ identified by ‘root’ with grant option;
grant all on . to ‘root’@’%’ identified by ‘root’;
flush privileges;
create database hive character set latin1; - 启动Hive
cd …/bin
sh hive
如果出现错误,如下解决方案:
从第三个错误开始查看,在错误信息中是否有READ or UNREAD COMMITTED
解决方案 - 编辑
vim /usr/my.cnf - 在文件尾部追加
binlog_format=mixed - 重启mysql
service mysql restart
Hive的体系结构
优化
map side join
join和where的优化
group by的优化
调整切片大小
开启严格模式
count和distinct连用
当count和distinct连用的时候,可以考虑先利用子查询进行去重,再去重的是i后可以使用多个ReduceTask完成,最终在利用一个ReduceTask来完成计数。
案例: