Hive指南
标签(空格分隔): Hive
HIVE基本介绍
Hive是由FaceBook开源的用于解决海量结构化日志的数据统计,后成为Apache Hive的一个开源项目,Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL(也成为HQL)查询功能,它的本质是将HQL转化为MapReduce程序,灵活性和扩展性比较好,支持自定义函数(UDF),自定义存储格式来进行数据处理与存储,但由于其时延较长,适合做离线数据处理。
HIVE体系结构
Hive处理的数据存储在HDFS上,又使用mapreduce来分析数据底层的实现,最后执行的程序又运行在Yarn上,相当于整合了Hadoop的三大框架,所以说hive是hadoop的数据仓库。
- 用户接口: Client
CLI(Hive shell) 、JDBC/ODBC(Java访问Hive)、WEB UI(浏览器访问Hive) - 元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否为外部表)、表的数据所在目录等;
元数据默认存在Hive自带的derby数据库中,推荐使用MYSQL - Hadoop
使用HDFS进行存储,使用MapReduce进行计算 驱动器Driver
包含:解析器、编译器、优化器、执行器;- 解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对ATS进行语法分析、比如表是否存在、字段是否存在、SQL语义定义是否有误(比如select中被判定为聚合的字段在group by中是否有出现);
- 编译器:将AST编译生成逻辑执行计划;
- 优化器:对逻辑执行计划进行优化;
- 执行器:把逻辑执行计划转换成可以运行的物理计划,对Hive来说就是MR,或者TEZ、Spark;
HIVE的特点
- 操作接口采用类SQL语法,提供快速开发的能力,容易上手
- 避免了去写MapReduce、减少开发人员的学习成本
- 统一的元数据管理,可与impala/spark等共享元数据
- 易于扩展,HDFS+MapReduce可进行集群规模扩展,支持自定义函数
- 数据的离线处理:比如日志分析、海量结构化数据离线分析
- Hive的执行延迟比较高、因此hihve常用于对实时性要求不高的场合
- Hive的优势在于处理大数据,对于处理小数据没有优势,因此Hive的执行延迟比较高
HIVE使用
版本:hive0.13.1 hadoop2.5.0 mysql5.6
1)安装mysql
选择集群中的一台机器安装mysql server 、mysql client
步骤:
1、 查看是否已安装mysql # rpm -qa | grep mysql
如果有、删除已经安装的系统自带的mysql #rpm -e –nodeps 【name】
2、 解压mysql安装包,赋执行权限
3、安装mysql server
4、查看随机的密码(安装时有提示)
5、安装客户端
6、启动mysql
7、客户端登陆mysql
8、更改密码并再次登录
9、对user表进行修改,设置用户可以从其他机器登录,然后修改root的其他选项
相关命令:
mysql> delete from user where User='root' and Host='hadoop001';
Query OK, 1 row affected (0.00 sec)
mysql> delete from user where User='root' and Host='127.0.0.1';
Query OK, 1 row affected (0.00 sec)
mysql> delete from user where User='root' and Host='::1';
Query OK, 1 row affected (0.00 sec)
最终表的内容:
2)安装Hive
1、解压并更改名字
2、拷贝mysql驱动jar包,到Hive安装目录的lib下驱动包所在位置:
3、配置conf下的hive-env.sh的hadoop、hive环境变量
4、配置hive-site.xml
配置连接数据库的四要素
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop001:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
配置metastore
需先启动hadoop,创建该目录并赋权限
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
3)启动Hive
4)基本的DDL、DML语句
创建数据库:
创建表
加载数据
数据所在地址
加载方法:
查询语句
HIVE详解
Hive数据类型
Hive数据库操作
在Hive命令行中,默认数据库为default
创建一个新的数据库:
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
删除数据库
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
修改数据库
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...); -- (Note: SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role; -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
查看数据库详细信息
desc database extendes database_name;
Hive表的操作
- 创建表:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
//*创建一个表,指定表的类型(临时表、外部表)、表的名称*
[(col_name data_type [COMMENT col_comment], ...)]
//*表的列、包括列的名称、列的类型*
[COMMENT table_comment]
//*表的说明*
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
//*分区表,指定分区的列的名称、类型、*
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
//*指定数据文件中数据存储格式、每行分隔、数据文件类型*
[LOCATION hdfs_path]
//*数据在HDFS上的存储位置*
[TBLPROPERTIES (property_name=property_value, ...)]
//*指定表的属性*
[AS select_statement];
//子查询
创建与指定表数据结构相同的表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
表中列的数据类型
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type
基本数据类型primitive_type
primitive_type
: TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| DOUBLE PRECISION
| STRING
| BINARY
| TIMESTAMP
| DECIMAL
| DECIMAL(precision, scale)
| DATE
| VARCHAR
| CHAR
数组类型array_type
: ARRAY < data_type >
集合类型map_type
: MAP < primitive_type, data_type >
struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], ...>
union_type
: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)
row_format:每列和每行数据分隔符
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
- 删除表
DROP TABLE [IF EXISTS] table_name [PURGE]; -- (Note: PURGE available in Hive 0.14.0 and later)
//*如果是 内部表,删除表后就会删除元数据和表文件,如果是外部表,只会删除元数据*
- 修改表
- 重命名表
ALTER TABLE table_name RENAME TO new_table_name;
- 更改表的属性
- 重命名表
ALTER TABLE table_name SET TBLPROPERTIES table_properties;
使用hdfs dfs -ls -R /user/vin命令得到下面
/user/vin/p1/p2/*.txt
table_properties:
: (property_name = property_value, property_name = property_value, ... )
- 修改分区(添加、修改、删除)
//Add Partitions
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
//Rename Partition
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
//Drop Partitions
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
[IGNORE PROTECTION] [PURGE]; -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)
- 加载数据
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
//其中加local是从本地加载数据到hive表,否则从HDFS上加载, OVERWRITE是是否覆盖表中原有数据
hive> CREATE TABLE csv1_table(a string, b string)
> ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
> WITH SERDEPROPERTIES (
> "separatorChar" = ",",
> "quoteChar" = "'",
> "escapeChar" = "\\"
> )
> STORED AS TEXTFILE;