09-13 hive(二)

hive补充:

hive缺点:高 延迟,因为hive将HQL语句转化为mapreduce任务进行计算,MapReduce的固定流程总要执行;

hdfs: 全程 hadoop distributed file system

Hive: 概念

是一个构建在hadoop上的数据仓库工具;hive已成为一个通用的、可伸缩的数据处理
平台;

1、Hive由facebook实现并且开源(免费);
2、是基于hadoop的一个数据仓库工具;
3、可以将hdfs中结构化的数据影射为一张数据表;
4、提供HQL(hive SQL)查询功能
5、底层数据是存储在HDFS上的(hadoop分布式文件系统)
6、hive本质是将sql语句转化为MapReduce任务进行;
7、使不熟悉mapreduce的用户可以快速的利用hql处理和计算HDFS上的结构化数据,适用于离线的批量的数据计算;

Hive依赖的hdfs存储数据, hive其实就是一个基于HDFS的一个mapreduce计算工具,对存储在HDFS中的数据进行分析和管理;

Linux补充:

~Bin 文件:命令文件
~etc文件:配置文件
~sbin文件:更高级的命令文件,root用户的命令

二、 操作:

1、 启动hive 之前启动hadoop
a) bin/hive
b) 先关闭 hive hive> quit
再关闭hadoop;

1、

当hive的元数据存储在derby中时hive元数据存储在只能在hive的安装目录下启动;
Hive 的元数据存储在MySQL中时hive可以在任何目录下启动;

修改环境变量后需要启动环境变量文件: ~source ./bash.

Hive学习

1、 hive在数据分析汇总的地位
大公司使用mysql,小中型公司使用hive;

2、 hive和MySQL的区别:
都实现了SQL标准,SQL时普通话,mysql和hivesql 时方言;

3、 hive是什么?

Hive是大数据工具,海量数据;

HIVE是建立在hadoop之上的,利用hadoop的分布式存储系统hdfs;

hive通过吧hiveSQL进行解析和转换,最终生成一系列的基于hadoop的mapreduce任务(不必专门用java开发mapreduce应用,更难),通过执行这些任务完成数据处理;

4、 hive与传统数据库的区别

Hive RDBMS
查询语言 HQL SQL
数据存储 Hdfs Raw device or local fs
执行 Mapreduce Executor
执行延迟 高 低
处理数据规模 大 小
索引 0.8版本后加入位图索引 有复杂的索引

执行引擎:hive可以是mapreduce(最慢,有一些模板化的流程,不论数据多大,都会执行),tez,spark(快)
Hadoop集群是可以横向扩展的,增加服务器(增加节点),修改配置文件,重启集群;
同理也可以去除服务器,减少节点;

Apache是一个软件开元基金会;

MySQL的数据类型:

Hive的数据类型:

基本数据类型:
复杂类型: struct ,map(键值对组合),array(数组);

Hive数据定义与操作

Hadoop跟目录下: ~hive
进入hive环境
Hive环境下:quit; 退出关闭hive

一、数据库相关:

1、 创建数据库
create database if not exists lxx; (英文分号)
2、 在hive中执行hadoop的命令,查看文件或目录
~dfs –ls/;
3、!ls /opt/module/
查看当前目录下的文件
3、 查看数据库信息
Desc database extended 数据库名;
4、 删除数据库
a) Drop database if exists xxx; (删除空的数据库)
b) Drop database if exists xxx cascade ;强制删除数据库
5、 修改数据库
a) Alter database/schema xxx set location hdfs_path; 简单修改存放路径

Hive 前期操作:

1、 在hadoop家目录下创建一个datas文件,并且给你赋予权限(每创建一个文件,都要给你、其赋予权限):
~Hadoop fs –mkdir /datas
Hadoop fs –chmod g+w /datas

Hadoop fs –put /home/hadoop/datas/* /datas

将hadoop本地的文件上传的hadoop集群(hdfs);(

注: hdfs的/目录 和本地的文件系统的/目录 不是同一个
如:在linux上hadoop用户下的根目录下创建文件:
~mkdir datas
在hadoop集群的hdfs上创建目录文件:
~hadoop fs –mkdir datas )

2、用xftp 将(windows)本地系统的文件 上传到 linux(centos)的hadoop中指定路径下,如:
在xtfp: cd 目标文件,然后再当前路径下:
~scp –r ./* [email protected]:/home/hadoop/datas
Scp secure copy简写,是不同的linux系统之间进行文件或目录的拷贝;
./* 表示当前目录下的所有文件
上传到 hadoop家目录下的datas 文件中;

1、 创建xxx 数据库

Create database if not exists xxx ;
2、 use xxx; 使用数据库
3、 创建用户使用表
Create table if not exists use_info(
Use_id string,
User_name string,
Sex string,
Age int,
City string,
Firstactivetime string,
Level int ,
Extral1 string,
Extral2 map<string,string>)

#注明了结构化数据的转换识别规则:

Row format delimited fields terminated by ‘\t’ 每行元素 通过 制表符 划分
Collection items terminated by ‘,’ 集合项通过分号识别
Map keys terminated by ‘,’ map的key和value通过冒号识别
Lines terminated by ‘\n’ 每一行通过换行符识别

创建数据表说明:

External 表示创建外部表; hive在创建内部表时,会将数据移动到数据仓库指向的路径;
创建外部表时,仅记录数据所在的路径,不对数据的位置坐任何改变;
Partitioned by 表示创建分区表

lustered by 表示创建分桶表
Sorted by 不常用;
Stored as textfile ; 指定文件存储类型;
Location 指定表在hdfs上的存储路径
Like 允许用户复制已有表结构,但是不复制数据;
As 后跟查询语句,根据查询结构创建表;

Hive> 下执行上语句(3),只是创建了一个空表,需要加载数据(用4语句)

4、 加载数据表
Hive > Load data inpath ‘/datas/user_info/user_info.txt’ overwrite into table user_info;

5、查看表的信息
hive> desc formated user_info;
5、 内部表与外部表区别

目前所创建的表都是所谓的管理表(内部表)这种表hive或多或少的控制着数据的声明周期,当删除一个管理表时,hive也会删除这个表中数据,管理表不妨表与其他工作分享数据;

1、 用external 说明常见外部表
2、 指定外部表存放数据的路径
3、 若不知定外部表的存放路径,hive将在hdfs上的 /user/hive/warehouse文件夹下以外部表名义创建一个文件夹,并且将属于这个表的数据全部存放在这里;
4、 当删除一个外部表时,只删除这个表的元数据信息,而不会删除数据;
5、 在生产中一般使用创建外部表来存储数据;

外部表的应用场景举例:
如:有个user文件,被各个部门建表使用,分析部门(user_fenxi),测试部门(user_ceshi),用户画像部门(user_huaxiang),单独某个部门(ˇˍˇ) 想~删除自己的表时只能删除(元数据—即建立的表,但是不能删除数据文件)

元数据信息在derby或者 MySQL中;如hive启动;

6、 修改表
改表名
Alter table 表名 rename to 新表名;
向表中添加列
Alter table 表名 add colums ( app_name string comment ‘ app name’,
Session_id long comment ‘ the current session id’);
修改列名
Alter table 表名 change column_name new_column_name new_type;
7、 删除表
Drop table if exists table_name;
8、 清空表 (知识删除表中数据)
Truncate table 表名;

分区表:分成了不同的文件夹

如日志文件,若不分区,所有的每天日志都存储在同一个文件中,若分区,每一天的日志单独存储;
分区有静态分区和动态分区。静态分区—手动指定;动态分区—同过数据进行判断; 静态分区实在编译时期,同过用户传递列名来实现,动态分区只有在SQL执行;

静态分区:

1、 创建表

Create table test
(name string,age int )
Partitioned by(country string)
Row format delimited fields terminated by’ \t’
Lines terminated by ‘\n’
Stored as textfile;

注意: 对于分区表 用户不允许扫描所有的分区,进行限制的原因是:通常分区表都用有非常大的数据量,而且数据增加迅速,如果没有分区限制的查询,可能会消耗令人不可接受的巨大资源来处理这个表;

向分区中插入数据:
Insert into table test partitioned by( country=’china’) values(“zhangsan”,1);

查询分区表中的数据
Select * from test where country=”china”;

删除分区
Alter table test drop partitioned (country=”china”);

动态分区:

数据的导入与导出:

1、 从本地导入表中(即从本地往表里插入数据的过程)
Load data local inpath ‘本地路径’ overwrite into table soqou(partition(partcoll=vall,…));

2、 从HDFS导入表中
Load data inpath ‘hdfs上的路径’ into table 表名 (partition(partcoll=vall,…));

3、 将hive表中的数据导出到本地
Insert overwrite local directory ‘本地路径’ 查询语句;

4、 将hive表中的数据导出到HDFS中

Insert overwrite directory ‘hdfs路径’ 查询语句;

Hive中间阶段回顾

Hadoop fs 、hdfs dfs 、 hadoop dfs 无区别,都是表时hadoop命令的调用;

Start-all.sh 知识启动hdfs ,没有启动yarn;
Start-all.sh + start-yarn.sh 执行这两个命令才能启动hadoop;

Vmware 设置虚拟机的软件

伪分布式:用一个服务器,安装并启动hadoop集群,所有服务都在这台服务器山运行,会很慢;

完全分布式:通常是三个节点以上的服务器,hadoop除了运行hive外,还有zookeepr(要求节点数为奇数),hbase,spark,kylin等;

分布式计算:分成多个任务取执行,然后将结果汇总起来;

动态分区:

Create database xxx; 创建数据库

Use xxx; 进入数据库

1、 创建user_trade表
Create table user_trade(
User_name string,
Price int,
Price double,
Pay_amount double,
Goods_category string,
Pay_time bigint)
Partitioned by (dt string)
Row format delimited fields terminated by’\t’;

执行下命令设置动态分区:(实现动态分区的前提:)
Set hive.exec.dynamic.partition=true;
Set hive.exec.dynamic.partition.mode=nonstrict;
Set hive.exec.max.dynamic.partition=10000;
Set hive.exec.max.dynamic.partition.pernode=10000;

数据源文件上传到HDFS上:

Hdfs dfs –Put /home/hdaoop/datas/user_trade/* /user/hive/warehouse/
Kaikeba.db/user_trade

注: 上述是hadoop 命令,只能hadoop环境下执行,不能再hive环境下执行;

修复分区表(从新检查一下分区有没有新增分区)
Msck repair table user_trade;

查询:
Select * from user_trade limit 6; ( limit 6 限制查询结构支取6条)

严格模式的设置

Set hive.mapred.mode=strict ;
Select * from `use_tradae limit 6;
Select * from user_trade where dt=’2017-01-01’;

不管静态分区还是动态分区,分区的前提是要有一张表,然后提前指定分区标准—静态分区, (插入过程汇总)分区标准以后续查询结果为准—动态分区,例如:

动态分区eg:

Mapreduce是一种传统的面相批量任务的处理框架。像tez这样的新处理引擎越来越倾向于近实的查询访问。随着yarn的出现,hdfs日益成为一个多租户环境,允许很多的访问模式,例如批量访问,实时访问和交互访问;

动态分区终极解释:

分区的含义: 当一个表太大的时候,将表分区以便于后续快速查询;表分区类似于一个文件中再创建多个文件夹分类存储;

Put—(hadoop命令)将hadoop本地的文件上传到hive中,分区表中用,hive中中put上一个文件后只是在hive中 有了一个文件夹,但是此时还不能识别文件夹中的内容,进行 修复操作后 就可以是识别内容了;

Load—

内部表通常同坐中间表,不能直接产生结果,先产生一些中间结果,在计算产生结果。

猜你喜欢

转载自blog.csdn.net/weixin_46400833/article/details/108566294
今日推荐