Hive 知识点总结
- 格式:docx
- 大小:58.57 KB
- 文档页数:40
hive基础总结(⾯试常⽤)hive是基于Hadoop的⼀个数据仓库⼯具,可以将结构化的数据⽂件映射为⼀张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进⾏运⾏。
Metastore (hive元数据)Hive将元数据存储在数据库中,⽐如mysql ,derby.Hive中的元数据包括表的名称,表的列和分区及其属性,表的数据所在的⽬录Hive数据存储在HDFS,⼤部分的查询、计算由mapreduce完成Hive数据仓库于数据库的异同(1)由于Hive采⽤了SQL的查询语⾔HQL,因此很容易将Hive理解为数据库。
其实从结构上来看,Hive和数据库除了拥有类似的查询语⾔,再⽆类似之处。
(2)数据存储位置。
hdfs raw local fs(3)数据格式。
分隔符(4)数据更新。
hive读多写少。
Hive中不⽀持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
INSERT INTO … VALUES添加数据,使⽤UPDATE … SET修改数据不⽀持的HDFS ⼀次写⼊多次读取(5)执⾏。
hive通过MapReduce来实现的⽽数据库通常有⾃⼰的执⾏引擎。
(6)执⾏延迟。
由于没有索引,需要扫描整个表,因此延迟较⾼。
另外⼀个导致Hive执⾏延迟⾼的因素是MapReduce框架(7)可扩展性(8)数据规模。
hive⼏种基本表类型:内部表、外部表、分区表、桶表内部表(管理表)和外部表的区别:创建表外部表创建表的时候,不会移动数到数据仓库⽬录中(/user/hive/warehouse),只会记录表数据存放的路径内部表会把数据复制或剪切到表的⽬录下删除表外部表在删除表的时候只会删除表的元数据信息不会删除表数据内部表删除时会将元数据信息和表数据同时删除表类型⼀、管理表或内部表Table Type: MANAGED_TABLEcreate table if not exists dept(deptno int,deptname string,address string)row format delimited fields terminated by '\t';//加载HDFS⽂件到Hive表中load data inpath '/input/dept.txt' into table dept;//⽤来指定原⽂件的列分隔符row format delimited fields terminated by '\t';load 如果操作的HDFS上的⽂件,代表着会移动或者剪切⽂件desc formatted dept; //描述表结构信息Location: hdfs://bigdata/user/hive/warehouse/db01.db/deptTable Type: MANAGED_TABLE表类型⼆、外部表create external table emp(empno int,empname string,empjob string,mgno int,birthday string,salary float,bonus float,depno int)row format delimited fields terminated by '\t'location '/input/demo';//描述表结构desc formatted emp;Location: hdfs://bigdata/input/demoTable Type: EXTERNAL_TABLE删除内部表drop table dept;删除外部表drop table emp;清空表数据truncate table student;表类型三、分区表分区表创建表的时候需要指定分区字段,分区字段与普通字段的区别:分区字段会在HDFS表⽬录下⽣成⼀个分区字段名称的⽬录,⽽普通字段则不会,查询的时候可以当成普通字段来使⽤,⼀般不直接和业务直接相关。
一、文档说明熟悉Hive功能,了解基本开发过程,及在项目中的基本应用。
注意:本文档中但凡有hive库操作的语句,其后面的“;”是语句后面的,非文档格式需要。
每个hive语句都要以“;”来结束,否则将视相邻两个分号“;”之间的所有语句为一条语句。
二、Hive(数据提取)概述Hive是构建在HDFS 和Map/Reduce之上的可扩展的数据仓库。
是对HADOOP的Map-Reduce进行了封装,类似于sql语句(hive称之为HQL)计算数据从而代替编写代码对mapreduce的操作,数据的来源还是HDFS上面的文件。
Hive中的表可以分为托管表和外部表,托管表的数据移动到数据仓库目录下,由Hive管理,外部表的数据在指定位置,不在Hive的数据仓库中,只是在Hive元数据库中注册。
创建外部表采用“create external tablename”方式创建,并在创建表的同时指定表的位置。
Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中(如果数据是在HDFS上;但如果数据是在本地文件系统中,那么是将数据复制到表所在的目录中)。
三、Hive的元数据Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。
目前Hive将元数据存储在数据库中,如Mysql、Derby中。
Hive metastore 三种存储方式:Hive的meta 数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。
远端存储比较适合生产环境。
1、使用derby数据库存储元数据(内嵌的以本地磁盘作为存储),这称为“内嵌配置”。
HiveHiveQL基础知识及常⽤语句总结基础语句CREATE DROP建表、删表建表---------------------------------------- 1. 直接建表---------------------------------------- 创建⾮分区表时,省去后半部分即可create table if not exists table_name(id string comment 'id ',num string comment '数值')partitioned by (ym string comment '⽉份 ');---------------------------------------- 2. 复制其他表的表结构--------------------------------------create table if not exists new_table like old_table;---------------------------------------- 3. 从其他表选取数据创建并插⼊新表--------------------------------------create table if not exists new_table asselect * from old_table;删表drop table table_name ;ALTER更改表结构分区添加分区alter table table_nameadd if not exists partition (y='2016',m='12');删除分区ALTER TABLE table_name DROP IF EXISTS PARTITION (ym='201706');重命名分区ALTER TABLE table_name PARTITION (y='2017',m='05')RENAME TO PARTITION (y='2017',m='06');列删除列ALTER TABLE table_name DROP COLUMN id;增加列Alter table table_name add COLUMNS (id string comment '代号');修改列 (此处可⽤于修改字段注释)ALTER TABLE table_name CHANGE id level string comment '层级代号';替换列ALTET TABLE table_name REPLACE COLUMNS(id_new string COMMENT '新字段1', level_new string COMMENT '新字段2');表重命名表名ALTER TABLE old_table RENAME TO new_table;INSERT插⼊插⼊单条数据(Hive 已⽀持单条插⼊)insert into table_name values(201705,'lol');插⼊分区表insert overwrite table table_name PARTITION (y='2017',m='01')select *from table_name_2where pt = concat('2017','01');LOAD载⼊重写载⼊分区表(⾮分区表同理)LOAD DATA LOCAL INPATH 'total.txt' overwrite into table table_name partition (y='2016',m='12');其他语句其他基础SQL类似的语句不再赘述,此处再多列举⼏个常⽤语句:-- 列举库或表SHOW DATABASES/TABLES;-- 根据关键字查找库或表SHOW DATABASES/TABLES LIKE "*keyword*";-- 列举所有函数SHOW FUNCTIONS;-- 查看分区SHOW PARTITIONS test_table;-- 查看建表语句SHOW CREATE TABLE table_name;-- 详细描述,包括建表时间、最后更新时间、⾏数统计等。
hive的基础知识-回复Hive的基础知识[Hive的基础知识],作为一个开源的数据仓库基础设施,是构建在Hadoop之上的。
它提供了一个简单方便的方式,让用户能够利用SQL 查询分析大规模的数据。
相对于传统的关系型数据库,Hive的优势在于其可扩展性和容错性。
一、Hive的概述Hive最初由Facebook开发,其目标是为了解决处理大规模数据的难题。
Hive实际上是建立在Hadoop上的一个数据仓库基础设施,可以将结构化数据映射到Hadoop的分布式文件系统(HDFS)上,并提供完整的查询语言。
与传统的关系型数据库相比,使用Hive可以在海量数据上进行更快速的查询和分析,同时还能利用Hadoop的并行处理能力。
二、Hive的架构Hive的架构主要分为三部分:Metastore、Hive Query Language (HQL)和Execution Engine。
1. Metastore(元数据存储)Hive的Metastore存储着Hive的表结构信息,包括表的名称、列的类型、表的分区等。
Metastore可以将这些元数据存储在本地文件系统、MySQL等数据库中。
2. Hive Query Language(HQL)Hive使用Hive Query Language(HQL)作为查询语言,这是一种类似于SQL的语言,用于执行查询和数据处理操作。
HQL可以用来创建表、加载数据、执行查询等。
3. Execution Engine(执行引擎)Hive的执行引擎负责将HQL查询转化为MapReduce操作。
它将HQL查询拆分成一系列的Map和Reduce任务,然后将这些任务提交给Hadoop集群进行执行。
执行引擎可以选择使用Tez、Spark等不同的计算框架。
三、Hive表的创建与数据加载Hive的表可以通过HQL语句来创建,可以指定表的名称、表的字段和字段类型等信息。
以下是一个创建表的示例:sqlCREATE TABLE employees (id INT,name STRING,age INT,department STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ','STORED AS TEXTFILE;上述示例中,我们创建了一个名为employees的表,有四个字段:id、name、age和department。
Hive基础知识DBS表:存储数据库信息(在hdfs上的存储路径)TBLS表:存储表信息的COLUMNS_V2表:存储表字段hive建⽴⼀张表的内在机制:1. 在mysql中记录这张表的定义;2. 在hdfs中创建⽬录;3. 只要把数据⽂件都到⽬录下,就可以在hive中进⾏查询了;4. 因此,不同的hive只要是操作的同⼀个mysq,同⼀个hdfs集群,看到的数据是⼀致的;2.1 基本的使⽤⽅式1. 让提⽰符显⽰当前库():hive>set hive.cli.print.current.db=true;2. 显⽰查询结果时显⽰表的字段名称:hive>set hive.cli.print.header=true;以上设置都仅仅在该会话中有效,结束会话后就失效,解决⽅式:在linux的当前⽤户主⽬录中,编辑⼀个.hiverc(隐藏⽂件)⽂件,将参数写⼊其中:vi .hiverc(hive启动的时候会⾃动去当前⽤户⽬录下加载这个⽂件)set hive.cli.print.header=true;set hive.cli.print.current.db=true;2.2 hive执⾏脚本两个命令:hive -ehive -fhive -e 使⽤⽅式 hive -e "insert into table t_dest select * from t_src;"在任何地⽅(没有进⼊hive会话的情况) hive -f 使⽤情况 hive -f ftl.sql(当sql语句较多时,写⼊脚本中,运⾏脚本即可)#!/bin/bashhive -e "select * from db_order.t_order"hive -e "select * from default.t_user"hql="create table default.t_bash as select * from db_order.t_order"hive -e "$hql"2.3 hive 使⽤1、创建数据库hive中有⼀个默认的库: 库名: default 库⽬录:hdfs://hdp20-01:9000/user/hive/warehouse新建库: create database db_order; 库名:库建好后,在hdfs中会⽣成⼀个库⽬录(库名.db): 库⽬录:hdfs://hdp20-01:9000/user/hive/warehouse/db_order.db2、建表基本建表语句use db_order;create table t_order(id string,create_time string,amount float,uid string);表建好后,会在所属的库⽬录中⽣成⼀个表⽬录/user/hive/warehouse/db_order.db/t_order只是,这样建表的话,hive会认为表数据⽂件中的字段分隔符为 ^A正确的建表语句为:create table t_order(id string,create_time string,amount float,uid string)row format delimitedfields terminated by ',';这样就指定了,我们的表数据⽂件中的字段分隔符为 ","3、删除表drop table t_order;删除表的效果是: hive会从元数据库中清除关于这个表的信息; hive还会从hdfs中删除这个表的表⽬录;4、外部表和内部表内部表(MANAGED_TABLE):表⽬录按照hive的规范来部署,位于hive的仓库⽬录/user/hive/warehouse中外部表(EXTERNAL_TABLE):表⽬录由建表⽤户⾃⼰指定create external table t_access(ip string,url string,access_time string)row format delimited fields terminated by ',' location '/access/log';外部表和内部表的特性差别: 1、内部表的⽬录在hive的仓库⽬录中 VS 外部表的⽬录由⽤户指定 2、drop⼀个内部表时:hive会清除相关元数据,并删除表数据⽬录 3、drop⼀个外部表时:hive只会清除相关元数据;外部表的作⽤:对接最原始的数据⽬录,⾄于后⾯查询⽣成的新表,⽤内部表就好。
Hive-学习总结⼀.基础操作1.1变量和属性hivevar--(0.8以后版本) ⽤户⾃定义变量(读写) ${hivevar:foo} --变量引⽤和替换hiveconf --Hive相关的配置属性(读写)system -- Java定义的配置属性(读写)env -- Shell环境定义的环境变量(只可读)在CLI中,可以使⽤SET命令显⽰或者修改变量值。
env命名空间可以作为Hive传递变量的⼀种⽅式,例如:$ YEAR=2012hive -e "SELECT*FROM t1 WHERE year= ${env:YEAR}"1.2 开启静默模式两个⽤处,1.当我们使⽤CLI查询数据,不想显⽰“OK”或者查询时间等,可以使⽤-S开启静默模式,这样也可以将查询的结果直接输出或者重定向到⽂件中hive -S -e "select*from t1" >/data/myquery2.模糊查找某些属性./hive -S -e "set" | grep warehousehive.metastore.warehouse.dir=/user/hive/warehousehive.warehouse.subdir.inherit.perms=true1.3执⾏sql的两种⽅式执⾏sql语句 hive -e "sql"执⾏sql脚本 hive -f xxx.hql通常我们约定使⽤src(代表源表)作为表名进⾏测试---源于Hive源码中的单元测试的写法,所以我们做测试前要创建⼀个src的表,同时必须⾄少有⼀⾏的数据在源表⾥⾯。
1.4 hiverc⽂件CLI 选项中有 -i ⽂件名,这个选项允许⽤户指定⼀个⽂件,当CLI启动时,在提⽰符出现前会先执⾏这个⽂件。
Hive会⾃动在HOME⽬录下寻找.hiverc⽂件,⽽且会⾃动执⾏这个⽂件中的命令。
hive面试知识点总结Hive是一个用于存储、查询和分析大规模数据集的数据仓库系统。
它建立在Hadoop的基础上,提供了类似于SQL的查询语言,使得对分布式存储系统中的数据进行查询和分析变得更加方便。
在Hive的面试中,候选人需要展示对Hive的深入了解和熟练掌握,包括HiveQL查询语言、Hive数据分区、Hive表和视图的创建和管理、Hive性能优化等方面的知识。
下面是一些常见的Hive面试知识点总结:HiveQL查询语言HiveQL是Hive的查询语言,类似于SQL语言,用于对Hive中存储的数据进行查询和分析。
在面试中,候选人需要展示对HiveQL语法的熟练掌握,包括常见的查询语句、聚合函数、子查询、连接操作等方面的知识。
候选人可以通过展示编写复杂查询、优化查询性能等方式来展示对HiveQL语言的熟练掌握。
Hive数据分区Hive支持对数据进行分区,可以基于数据的某个字段进行分区,提高查询性能。
在面试中,候选人需要展示对Hive数据分区的理解和应用,包括如何将数据进行分区、如何查询分区数据、如何管理分区等方面的知识。
候选人可以通过展示对分区数据的查询和管理操作来展示对Hive数据分区的熟练掌握。
Hive表和视图的创建和管理Hive支持创建和管理表和视图,用于对数据进行存储和查询。
在面试中,候选人需要展示对Hive表和视图的创建和管理的理解和应用,包括如何创建表和视图、如何添加和删除表的列、如何修改表的属性、如何查询视图数据等方面的知识。
候选人可以通过展示创建和管理表和视图的操作来展示对Hive表和视图的熟练掌握。
Hive性能优化Hive在处理大规模数据时需要考虑性能优化的问题。
在面试中,候选人需要展示对Hive性能优化的理解和应用,包括如何优化查询性能、如何提高数据加载性能、如何减少数据存储空间等方面的知识。
候选人可以通过展示优化查询性能、提高数据加载性能等操作来展示对Hive性能优化的熟练掌握。
hive 的用法摘要:一、Hive简介1.Hive的定义2.Hive的作用二、Hive的架构1.HiveQL2.元数据存储3.数据存储三、Hive的组件1.HiveQL解释器2.编译器3.优化器4.执行器四、Hive的数据类型1.原子数据类型2.复合数据类型五、HiveQL的使用1.创建表2.数据插入3.查询数据4.数据更新与删除六、Hive的高级特性1.分区2.分桶3.索引七、Hive的优化1.查询优化2.存储优化八、Hive与大数据生态系统的结合1.Hadoop2.Spark3.数据仓库正文:Hive是一个基于Hadoop的数据仓库工具,它可以用来存储、查询和分析大规模的结构化数据。
Hive的用法主要涉及到HiveQL语言的使用,以及与Hadoop等其他大数据生态系统的结合。
本文将详细介绍Hive的用法和相关知识。
首先,我们需要了解Hive的架构。
HiveQL是Hive的核心部分,它是一种类SQL的查询语言,可以用来编写查询Hive数据的语句。
元数据存储用于存储表、分区、分桶等元数据信息。
数据存储层则用于存储实际的数据。
Hive由多个组件组成,包括HiveQL解释器、编译器、优化器和执行器。
这些组件协同工作,实现了HiveQL查询的解析、编译、优化和执行。
Hive支持多种数据类型,包括原子数据类型(如整型、浮点型、字符型等)和复合数据类型(如数组、结构体等)。
这些数据类型为编写HiveQL语句提供了基础。
在实际使用中,我们需要掌握HiveQL的使用方法。
例如,如何创建表、插入数据、查询数据以及更新和删除数据等。
此外,Hive还提供了许多高级特性,如分区、分桶和索引等,可以帮助我们更高效地管理和查询数据。
为了提高Hive的性能,我们需要了解如何对Hive进行优化。
这包括对查询语句的优化,以及对存储层的优化。
合理的优化策略可以显著提高Hive的查询效率。
最后,Hive作为大数据生态系统的一部分,需要与其他工具和框架相结合。
Hive练习题一、基础知识篇1. Hive中常用的数据类型有哪些?2. 请简述Hive中的内部表和外部表的区别。
3. Hive中的分区表和分桶表有什么不同?4. 如何在Hive中创建一个数据库?5. 如何在Hive中查看表结构?6. 请写出Hive中查询当前数据库的命令。
7. 如何在Hive中删除一个表?8. Hive中的排序操作有哪些?9. 请简述Hive中的MapReduce执行过程。
10. Hive中的窗口函数有哪些?二、SQL操作篇1. 查询员工表中工资最高的前5位员工信息。
2. 统计各部门员工的平均工资。
3. 查询部门编号为10的所有员工姓名及工资。
4. 查询工资在5000到10000之间的员工信息。
5. 按照部门编号分组,统计每个部门的员工人数。
6. 查询员工表中工资排名第二的员工信息。
7. 查询部门编号为20的员工平均工资。
8. 查询员工表中工资最低的员工信息。
9. 查询部门编号为10的员工工资总和。
10. 查询员工表中各岗位的平均工资,并按平均工资从高到低排序。
三、函数应用篇1. 请使用Hive内置函数,计算字符串"Hello Hive"的长度。
2. 请使用Hive内置函数,将字符串"hello hive"转换为大写。
3. 请使用Hive内置函数,计算数值123.456的整数部分和小数部分。
4. 请使用Hive内置函数,从日期"20210801"中提取年份、月份和日。
5. 请使用Hive内置函数,计算员工表中员工的年龄。
6. 请使用Hive内置函数,将员工表中的姓名和部门名称拼接成一个字符串。
7. 请使用Hive内置函数,统计员工表中各部门工资的平均值。
8. 请使用Hive内置函数,查询员工表中工资最高的员工信息。
9. 请使用Hive内置函数,计算员工表中每个部门的员工总数。
10. 请使用Hive内置函数,查询员工表中工资排名前三的员工信息。
hive的基础知识什么是Hive?Hive是一个开源数据仓库工具,用于处理大规模结构化和半结构化数据。
它构建在Apache Hadoop之上,利用Hadoop的分布式文件系统HDFS和分布式计算框架MapReduce进行数据处理。
为什么使用Hive?Hive的设计目标是使非程序员也能够轻松地通过SQL语句来查询和分析大规模数据。
与传统的关系型数据库不同,Hive使用HQL (Hive Query Language)作为查询语言,这是一种基于SQL的扩展语言,允许用户以熟悉的SQL语法来查询大规模数据集。
Hive的架构是怎样的?Hive的架构由三个主要组件组成:Metastore、Driver和Execution Engine。
1. Metastore:存储了表的元数据信息,包括表的模式、分区、存储位置等。
Metastore可以与多个Hive实例共享,以便不同用户可以访问同一组数据。
2. Driver:接收用户的HQL查询并解析它们,将它们转换为一系列的MapReduce任务并交给Execution Engine执行。
3. Execution Engine:根据Driver传递的查询计划启动一系列的MapReduce任务,并将结果返回给用户。
如何创建表?在Hive中,我们可以使用HQL语句来创建表。
首先通过`CREATEDATABASE`语句创建数据库,然后使用`USE DATABASE`语句将其设置为当前数据库。
接下来,使用`CREATE TABLE`语句创建表,并指定表名、列名和列的数据类型。
例如,以下HQL语句创建了一个名为"employees"的表,该表有三列:id(整数类型)、name(字符串类型)和salary(浮点数类型)。
sqlCREATE DATABASE mydatabase;USE DATABASE mydatabase;CREATE TABLE employees(id INT,name STRING,salary FLOAT);如何向表中插入数据?一旦创建了表,我们可以使用`INSERT INTO`语句将数据插入表中。
Hive 知识点总结摘要:Hive 是建立在Hadoop 上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop 中的大规模数据的机制。
Hive定义了简单的类SQL查询语言,称为QL,它允许熟悉SQL 的用户查询数据。
同时,这个语言也允许熟悉MapReduce 开发者的开发自定义的mapper 和reducer 来处理内建的mapper 和reducer 无法完成的复杂的分析工作。
1. HIVE结构Hive 是建立在Hadoop 上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop 中的大规模数据的机制。
Hive定义了简单的类SQL查询语言,称为QL,它允许熟悉SQL 的用户查询数据。
同时,这个语言也允许熟悉MapReduce 开发者的开发自定义的mapper 和reducer 来处理内建的mapper 和reducer 无法完成的复杂的分析工作。
1.1 HIVE架构Hive 的结构可以分为以下几部分:·用户接口:包括CLI, Client, WUI·元数据存储。
通常是存储在关系数据库如mysql, derby中·解释器、编译器、优化器、执行器· Hadoop:用HDFS 进行存储,利用MapReduce进行计算1、用户接口主要有三个:CLI,Client和WUI。
其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。
Client是Hive的客户端,用户连接至Hive Server。
在启动Client 模式的时候,需要指出Hive Server 所在节点,并且在该节点启动Hive Server。
WUI 是通过浏览器访问Hive。
2、Hive 将元数据存储在数据库中,如mysql、derby。
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
3、解释器、编译器、优化器完成HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
生成的查询计划存储在HDFS 中,并在随后有MapReduce 调用执行。
4、Hive的数据存储在HDFS 中,大部分的查询由MapReduce完成(包含* 的查询,比如select * from tbl 不会生成MapRedcue 任务)。
1.2 Hive和Hadoop关系Hive构建在Hadoop 之上,· HQL中对查询语句的解释、优化、生成查询计划是由Hive完成的·所有的数据都是存储在Hadoop中·查询计划被转化为MapReduce任务,在Hadoop中执行(有些查询没有MR任务,如:select * from table)· Hadoop和Hive都是用UTF-8编码的1.3 Hive和普通关系数据库的异同Hive RDBMS查询语言HQL SQL数据存储HDFS Raw Device or Local FS索引无有执行MapReduce Excutor执行延迟高低处理数据规模大小1. 查询语言。
由于SQL 被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。
熟悉SQL 开发的开发者可以很方便的使用Hive 进行开发。
2. 数据存储位置。
Hive 是建立在Hadoop 之上的,所有Hive 的数据都是存储在HDFS 中的。
而数据库则可以将数据保存在块设备或者本地文件系统中。
3. 数据格式。
Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。
由于在加载数据的过程中,不需要从用户数据格式到Hive 定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。
而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。
所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
4. 数据更新。
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。
因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO … VALUES 添加数据,使用UPDATE… SET 修改数据。
5. 索引。
之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key 建立索引。
Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。
由于MapReduce 的引入,Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。
数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。
由于数据的访问延迟较高,决定了Hive 不适合在线数据查询。
6. 执行。
Hive 中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select * from tbl的查询不需要MapReduce)。
而数据库通常有自己的执行引擎。
7. 执行延迟。
之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。
另外一个导致Hive 执行延迟高的因素是MapReduce 框架。
由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive 查询时,也会有较高的延迟。
相对的,数据库的执行延迟较低。
当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
8. 可扩展性。
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop 的可扩展性是一致的(世界上最大的Hadoop集群在Yahoo!,2009年的规模在4000台节点左右)。
而数据库由于ACID语义的严格限制,扩展行非常有限。
目前最先进的并行数据库Oracle在理论上的扩展能力也只有100台左右。
9. 数据规模。
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
1.4 HIVE元数据库Hive 将元数据存储在RDBMS 中,一般常用的有MYSQL和DERBY。
1.4.1 DERBY启动HIVE的元数据库进入到hive的安装目录Eg:1、启动derby数据库/home/admin/caona/hive/build/dist/运行startNetworkServer -h 0.0.0.02、连接Derby数据库进行测试查看/home/admin/caona/hive/build/dist/conf/hive-default.xml。
找到<property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:derby://hadoop1:1527/metastore_db;create=true</value><description>JDBC connect string for a JDBCmetastore</description></property>进入derby安装目录/home/admin/caona/hive/build/dist/db-derby-10.4.1.3-bin/bin输入./ijConnect’jdbc:derby://hadoop1:1527/metastore_db;create=true’;3、元数据库数据字典表名说明关联键BUCKETING_COLSCOLUMNS Hive表字段信息(字段注释,字段名,字段类型,字段序号) SD_IDDBS 元数据库信息,存放HDFS路径信息DB_ID PARTITION_KEYS Hive分区表分区键PART_IDSDS 所有hive表、表分区所对应的hdfs数据目录和数据格式。
SD_ID,SERDE_IDSD_PARAMS 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等SERDE_IDSEQUENCE_TABLE SEQUENCE_TABLE表保存了hive对象的下一个可用ID,如’org.apachtastore.model.MTable’, 21,则下一个新创建的hive表其TBL_ID就是21,同时SEQUENCE_TABLE表中271786被更新为26(这里每次都是+5?)。
同样,COLUMN,PARTITION等都有相应的记录SERDESSERDE_PARAMSSORT_COLSTABLE_PARAMS 表级属性,如是否外部表,表注释等TBL_ID TBLS 所有hive表的基本信息TBL_ID,SD_ID从上面几张表的内容来看,hive整个创建表的过程已经比较清楚了解析用户提交hive语句,对其进行解析,分解为表、字段、分区等hive对象根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新ID,与构建对象信息(名称,类型等)一同通过DAO方法写入到元数据表中去,成功后将SEQUENCE_TABLE中对应的最新ID+5。
实际上我们常见的RDBMS都是通过这种方法进行组织的,典型的如postgresql,其系统表中和hive元数据一样裸露了这些id信息(oid,cid 等),而Oracle等商业化的系统则隐藏了这些具体的ID。
通过这些元数据我们可以很容易的读到数据诸如创建一个表的数据字典信息,比如导出建表语名等。
导出建表语句的shell脚本见附一待完成1.4.2 Mysql将存放元数据的Derby数据库迁移到Mysql数据库步骤:1.5 HIVE的数据存储首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive 中的表,只需要在创建表的时候告诉Hive 数据中的列分隔符和行分隔符,Hive就可以解析数据。
其次,Hive 中所有的数据都存储在HDFS 中,Hive中包含以下数据模型:Table,External Table,Partition,Bucket。