基于hdfs存储数据,
基于mr分析数据
所以hive是基于hadoop 数据仓库工具
将结构化数据文件映射为数据表,提供类sql查询
本质:将sql转换成mr程序
主要用途:离线数据分析,比直接mr开发效率高
Hive组件
用户接口,包括 CLI : command line interface
JDBC/ODBC:
webGUI:通过浏览器访问
元数据存储
mysql
解释器、编译器、优化器、执行器
HQL
安装
hive,解压即可,不需要每台机器都安装
元数据存储在mysql,因为自带的derby 跟访问路径有关,每次访问都会生产log
而用mysql,无论什么路径启动hive,只需要访问mysql即可
安装mysql
yum install mysql mysql -server mysql -devel
安装完, /etc/init.d/mysqld start 启动mysql
mysql
mysql> use mysql; --使用mysql库
mysql> update user set Password=PASSWORD("new pwd") where user='root';
mysql>flush privileges;
mysql -u root -p
Enter password :<your new pwd>
mysql>grant all privileges on . TO '用户名'@'%' IDENTIFIED BY '密码' with GRANT OPTION; --远程管理msql
service mysqld status
chkconfig mysqld on 开机启动
chkconfig mysqld --list
配置hive
cd conf
hive主要操作
就是写sql
create table xx ()
创建表的时候指定数据的分隔符
分区partition
就是引用虚拟字段创建一级子目录,
虚拟字段不能是表中的字段
select * from t_user where country = 'china' ;
这个sql在数据库中,先查出t_user表所有数据,然后根据where条件过滤
而在数据仓库中,因为有partition确定子目录,查出的数据就是where过滤后的
--创建分区
create table 表名 (id int , name string) partitioned by (ext string);
--分区加载数据
load data local inpath '/linux_path/x.data' into table 表名;
load data inpath '/hdfs_path/x.data' into table 表名;
不分区不分桶加载数据
xx
分区不分桶加载数据
load data操作,实际上是hive帮我们执行 hadoop fs -put x.data /path
不分区分桶加载数据
insert + select 操作,在select查询时执行mr程序,对应mr的partitioner
双分区表
就是二级子目录
create table tab_day_hour (id int , name string)
partitioned by (dt string , hour string);
dt是一级子目录,hour是二级子目录 /path/dt/hour/xx.data
分桶
分桶字段必须是表中字段
create table tab_day_hour (id int , name string)
cluster by into num buckets;
--开启分桶
set hive.enforce.bucketing = true;
set mapreduce.job.reduces = 4;
--分桶加载数据
insert overwrite table 表名
select * from 表名 cluster by (列名);
分区,只是存储细化
分桶,是执行了rm程序,进行分文件操作(更小目录),hash值分桶
联合查询 join on会产生笛卡儿积现象
select A.* ,B.* from A join on A.id = B.id ;
image.png
如果表数据量巨大,造成笛卡儿积很庞大
当根据id分桶后,1这个人在A表就在一个桶,在B表就在一个桶
针对这2个小桶,再做笛卡儿积时,数据量小很多很多,所以分桶应用背景孕育而生!!!为提高查询效率
image.png
内部表 受hive管理
外部表 不受hive管理
网友评论