Hive基础指南

10 篇文章 0 订阅
7 篇文章 0 订阅

Hive指南

标签(空格分隔): Hive


HIVE基本介绍

Hive是由FaceBook开源的用于解决海量结构化日志的数据统计,后成为Apache Hive的一个开源项目,Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL(也成为HQL)查询功能,它的本质是将HQL转化为MapReduce程序,灵活性和扩展性比较好,支持自定义函数(UDF),自定义存储格式来进行数据处理与存储,但由于其时延较长,适合做离线数据处理。

HIVE体系结构

Hive处理的数据存储在HDFS上,又使用mapreduce来分析数据底层的实现,最后执行的程序又运行在Yarn上,相当于整合了Hadoop的三大框架,所以说hive是hadoop的数据仓库。
image_1at3hf8sa1ldhk081jhp13nfgus9.png-42kB

  • 用户接口: 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】
image_1at58kk2n15do1lii1smpc52t3b9.png-59.2kB
2、 解压mysql安装包,赋执行权限
image_1at58lrhl1re31rad137c178u90m12.png-59.3kB
3、安装mysql server
image_1at58mkt68dtck1lm1v0oabr1f.png-80kB
4、查看随机的密码(安装时有提示)
image_1at58n7a7ts3crj1t5o1it41oho1s.png-22.1kB
5、安装客户端
image_1at58pbqa1b5g19hl628j5astq9.png-38.5kB
6、启动mysql
image_1at58q1vulvfnnl1ornoa11jk1m.png-38.2kB
7、客户端登陆mysql
image_1at58qn60r32r0o8111sfafeg13.png-83.7kB
8、更改密码并再次登录
image_1at58ro1q1ltq1n131amh1i2t1ur11g.png-111kB
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)

最终表的内容:
image_1at58tij215lit1b72t1ffbapk1t.png-35.7kB

2)安装Hive

1、解压并更改名字
image_1at58vn1bn7a7073kidji157u2a.png-97.6kB
2、拷贝mysql驱动jar包,到Hive安装目录的lib下驱动包所在位置:
image_1at59119godv14jo8725b81ats2q.png-73kB
3、配置conf下的hive-env.sh的hadoop、hive环境变量
image_1at5923591vf71fim14md17705oh37.png-55.3kB
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

image_1at59mjkvnna1jbnctct3frv83k.png-41.4kB

4)基本的DDL、DML语句

创建数据库:
image_1at59oatv6bj131gosv1dagahm41.png-40.9kB
创建表
image_1at59p7k1jhe1co469q1p1b6eo4e.png-36.7kB
加载数据
数据所在地址
image_1at59q9gk4mk7jj134odg2e4r.png-30.9kB
加载方法:
image_1at59qks811vm1hmk1knc19k8fn558.png-45.7kB
查询语句
image_1at59r03lph31j6a17ai1100adm5l.png-36.8kB

HIVE详解

Hive数据类型

image_1at5j25bibqm1nr41a3a1nbe1bg662.png-103.6kB
image_1at5j2n1q4os7bl1as71r4913jr6f.png-89kB

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;

喜欢我的文章请关注微信公众号DTSpider

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值