hive概念、常用shell

理论基础

1 什么是Hive

Hive:由Facebook开源用于解决海量结构化日志的数据统计。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

本质是:将HQL转化成MapReduce程序

1)Hive处理的数据存储在HDFS

2)Hive分析数据底层的实现是MapReduce

3)执行程序运行在Yarn上

2 Hive的优缺点

优点

1)  操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

2)  避免了去写MapReduce,减少开发人员的学习成本。

3)  Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。

4)  Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

5)  Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

缺点

1.Hive的HQL表达能力有限

(1)迭代式算法无法表达

(2)数据挖掘方面不擅长

2.Hive的效率比较低

(1)Hive自动生成的MapReduce作业,通常情况下不够智能化

(2)Hive调优比较困难,粒度较粗

3 Hive架构原理

 

图6-1 Hive架构原理

1.用户接口:Client

CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

2.元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3.Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

4.驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

 

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

6.2 hive的常用shell操作

1 创建数据库、表

hive表分类:内部表、外部表、分区表、桶表。

创建数据库:

hive>create database if not exists hive;

创建表usr(id,name,age):

1:内部表:

hive>use hive

hive>create table if not exists usr(id bigint,name string,age int);

创建的表存储路径为/usr/local/hive/warehouse/hive/usr

hive>create table if not exists usr(id bigint,name string,age int) location ‘/usr/local/hive/warehouse/hive/usr’;

2:外部表:

hive>create external table if not exists usr(id bigint,name string,age int)

>row format delimited fields terminated by ‘’ location ‘/usr/local/data’

注意:

  内部表数据存储在hive.metastore.warehouse.dir【默认:/user/hive/warehouse】,外部表数据存储位置由用户自己决定。

  删除内部表会直接删除元数据【metadata】及存储数据,删除外部表仅仅删除元数据,HDFS上的文件不会被删除。

3:分区表

hive>create table if not exists usr(id bigint,name string,age int)

>partition by(sex boolean);

2 查看数据库、表

1:查看hive中所有数据库。

hive>show databases;

2:查看表:

hive>use hive;

hive>show tables;

3 向表中装入数据

1、把master的数据装入usr

hive>load data local inpath ‘/usr/local/data’ overwrite into table usr;

2、把hdfs上的数据装入usr

hive>load data inpath ‘hdfs://master_server/usr/local/data’ overwrite into table usr;

4 查询表的数据

和sql语句完全相同。

例如:向表usr1中插入usr的数据并覆盖原有的数据:

hive>insert overwrite table usr1 select * from usr where age=10;

5 删除数据库和表

1:删除数据库

hive>drop database if exists hive;

2:删除表

hive>drop table if exists usr;

注意:

如果是内部表,元数据和实际数据都会被删除;

如果是外部表,只删除元数据,不删除实际数据。

数据类型:参照https://www.cnblogs.com/hemomo/p/12271614.html

 

复合类型案例:

创建一个员工表(名称:employees)

第一个字段类型为字符串,字段名称:name(描述:员工名字)

第二个字段类型为浮点型,字段名称:salary(描述:员工薪水)

第三个字段类型为数组,其中每个数组元素都是字符串,字段名称:subordinates(描述:下属员工)

第四个字段类型是一个由键一值对构成的map,其中键是字符串、值是浮点型,字段名称:deductions(描述:其中键表示税种,值表示相应税种的金额,这些税将会在发薪水的时候从员工工资中扣除掉)

第五个字段类型是struct,字段名称:address(描述:存储每名雇员的家庭住址)(address的详细结构,其中前三个元素类型都是字符串,名称分别为street、city、state,分别表示街道、城市、省份,最后一个元素类型是整型,名称是zip,表示邮编)

 

1:创建表

CREATE TABLE employees(

name STRING,

salary FLOAT,

subordinates ARRAY<STRING>,

deductions MAP<STRING,FLOAT>,

address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>);

2:加载数据:

hive> load data local inpath '/home/zkpk/experiment/demo.txt' overwrite into table employees;

3:将hive employees表中数据下载到本地:

hive> insert overwrite local directory '/home/zkpk/employees' select * from employees;

4:查询的数据存入新表

CREATE TABLE employees11(

name STRING,

salary FLOAT);

insert into employees11 select name,salary from employees;

 

项目1:hive实现词频统计

1:上传数据

完整的路径:/home/wordcount.txt

2:hql实现wordcount算法

hive>create table docs(line string);

hive>load data inpath ‘inputh’overwrite into table docs;

hive>create table word_count as select word,count(1) as count from

>(select explode(split(line,’ ’)) as word from docs) w

>group by word order by word;

查看结果

hive>select * from word_count;

说明:

explode(split(line,’ ’) //把拆分后的数组,每一个元素变成一行

原文地址:https://www.cnblogs.com/hemomo/p/13065732.html