《第四章 HiveQL:数据定义》
(1)Hive不支持行级插入操作、更新操作、删除操作
4.1 Hive中的数据库
(1)Hive中数据库的概念,本质上仅仅是表的一个目录或者命名空间。避免表命名冲突
(2)在所有数据库相关的命令中,都可以使用SCHEMA关键字代替TABLE关键字
(3)Hive会为每个数据库创建一个目录。数据库中的表将会以这个数据库目录的子目录的形式存储。例外是default数据库中的表,这个数据库本身没有自己的目录。
(4)数据库所在目录:hive.metastore.warehouse.dir设定。 默认是:/user/hive/warehouse/
(5)USE dbname;和在文件系统中切换工作目录是一个概念。
(6)并没有一个命令可以让用户查看当前所在的是哪个数据库。唯一方法:
hive> set hive.cli.print.current.db = true ;
4.2 修改数据库
(1)ALTER dbname SET DBPROPERTIES (‘ ‘ = ‘..')
数据库的其它元素信息都是不可更改的,包括数据库名和数据库所在目录位置。
实在没办法,可以删除或者“重置”数据库属性。
DBPROPERTIES中的属性可以修改(待确定)
4.3 创建表
(1)创建表时,如果用户指定的表模式和已经存在的这个表的模式不同的话,Hive不会为此做出提示。
如果用户的意图是使这个表具有重新指定的那个新的模式的话,就需要先删除这个表,也就是丢弃之前的数据,然后再重新建这张表。
可以考虑使用一个或者多个ALTER TABLE语句来修改已经存在的表的结构。
(2)TBLPROPERTIES还可用作表示关于数据库连接的必要的元数据信息
(3)区分:数据库元数据的存储目录、表中数据的存储目录
(4)SHOW TBLPROPERTIES table_name ; 列举某个表的TBLPROPERTIES属性信息
(5)SHOW TABLES IN mydb;
in database_name语句和对表名只用正则表达式 两个功能不支持同时使用
(6)hive> DESCRIBE mydb.employees.salary ;
salary float Employee salary
(最后两个单词是COMMENT注释内容)
如果只想查看某一个列的信息,只需要在表名后增加这个字段的名称即可。
4.3.1 管理表
------------(把新浪博客的内容转移过来)---------
Hive(1-2)
1.
(1)通常,要处理的数据文件是存储在HDFS中的,而HDFS由NameNode进行管理。Metastore(元数据存储)是一个独立的关系型数据库(通常是一个MySQL实力),Hive会在其中保存表模式和其他系统元数据。
(2)Hive最适合于数据仓库程序,对于数据仓库程序不需要实时响应查询,不需要记录级别的插入、更新和删除。当然,Hive也非常适合于有一定SQL知识的用户。
2. 《第二章 基本操作》
(1)Hive中有一些其他组件。Thrift服务提供了可远程访问其他进程的功能,也提供使用JDBC和ODBC访问Hive的功能。这些都是基于Thrift服务实现的。
所有的Hive客户端都需要一个metastoreservice(元数据服务),Hive使用这个服务来存储表模式信息和其他元数据信息。通常情况下会使用一个关系型数据库中的表来存储这些信息。默认情况下,Hive会使用内置的Derby SQL服务器,起可以提供有限的、但进程的存储服务。(例如,当使用Derby时,用户不可以执行2个并发的Hive CLI实例。)然而,如果是在个人计算机上或者某些开发任务上使用的话 这样也是没问题的。对于集群来说,需要使用MySQL或者类似的关系型数据库。
HWI:Hive网页界面,提供了远程访问Hive的服务
表存储所位于的顶级目录,由属性hive.metastore.warehosue.dir指定
三种模式下 表数据 的存储路径
本期模式:file:///user/hive/warehouse
其他模式:hdfs://namenode_server/user/hive/warehouse
(2)Hadoop集群的三种模式:
1)本地模式:用户的job在同一个JVM实例中执行所有任务
2)在分布式模式下,集群中会启动多个服务。JobTracker管理job,HDFS由NameNode管理。每个工作节点上都有job task在运行,有每个节点上的TaskTracker服务管理,而且每个节点上还有分布式文件系统中的文件数据块,有每个节点的DataNode服务来管理。
3)伪分布模式:就是 一个单节点的集群。
(3)Hive中很多属性的配置额可以写在文件$HOME/.hiverc文件中。每一次启动Hive 都会执行这个文件。
(4)Hive的所需组件中,只有一个是Hadoop没有的,即metastore(元数据存储)组件。元数据存储中存储了如表的模式和分区信息等元数据信息。
多用和和系统可能需要并发访问元数据存储,所以默认的内置数据库并不适用于生产环境。
(5)Hive变量内部是以Java字符串的方式存储。用户可在查询中引用变量。Hive会先用变量值替换掉查询的变量引用,然后才会将查询语句提交给查询处理器。
在CLI中查询语句中的变量引用会先杯替换掉然后才会提交给查询处理器。
(6)Hive中所有内置属性位置:$HIVE_HOME/conf/hivedefault.xml.template
------【Hive 命令 (1-1)】 ---------
1.
(1)设置Hive表的顶级目录
set hive.metastore.warehouse.dir=/user/myname/hive/warehouse
(2)显示字段名称
hive> set hive.cli.print.header=true;
(若想总显示:将其加到$HOME/.hiverc文件中)
2.
(1)$ hive --help 简化版:$ hive -h
(2)$ hive --help --service cli 显示CLI所提供的选项列表
(3)变量和属性。--define key=value,--hivevar key=value。二者等价,都可以让用户在命令行定义用户自定义变量以便在Hive脚步中引用。
在CLI中使用SET命令显示或修改变量值
(4)hive> set ent:HOME; 显示一个变量的值
hive> set;显示env命名空间中定义的所有变量
(5)--hiveconf
$ hive --hiveconf hive.cli.print.current.db=true
hive (default) > set hiveconf:hive.cli.print.current.db;
hive (default) > set hiveconf:hive.cli.print.current.db=false;
hive > ...
增加新属性:
hive --hiveconf y=5
hive > set y;
y=5
hive > select * from whatsit where i = ${hiveconf:y} ;
$ YEAR=2012 hive -e "SELECT * FROM mytable WHERE year = ${env:YEAR}" ;
(env命名空间向Hive传递变量的。一个可选方式。env前缀不可省)
(6)一次查询
$ hive -e "SELECT * FROM mytable LIMIT 3";
$ hive -S -e "select * from mytable limit 3" > /tmp/myquery
$ hive -S -e "set" | grep warehouse
(模糊查询某个属性名)
(7)文件中执行Hive查询
$ hive -f /path/to/file/withqueries.hql
hive> source /path/to/file/withqueries.hql;
(在Hive shell中用source命令 来执行一个脚本文件)
(8)命令前加!
在hive shell中执行bash shell命令
hive> ! /bin/echo "what up dog" ;
hive> ! pwd ;
(但不能进行交互)
(9)hive shell中使用hadoop命令
去掉hadoop命令中的hadoop即可。
hive> dfs -ls / ;
hive> dfs help ;
(Hive会在同一个进程中执行这些命令)
---------【Hive命令(3-4)】---------------
1. 数据库
(1)
hive> create database financials;
hive> create database if not exists financials;
hive> drop database if exists financials ;
hive> drop database if exists financials cascade; (restrict)
hive> show databases like 'h.*' ; (以h开头,其他字符结尾)
(在所有数据库相关的命令中,都可用关键字SCHEMA代替TABLE)
(2)修改默认位置
hive> create database financials
> location '/my/preferred/directory' ;
(3)
hive> create database financials
> with dbproperties ('creator' = 'Mark Moneybags', 'date' = '2012-01-02');
hive> describe database extended financials ;
hive> alter database financials set dbproperties ('edited-by' = 'Joe Dba');
2. 表
(1)拷贝表模式(无需拷贝数据)
CREATE TABLE IF NOT EXITS mydb.employees2 LIKE mydb.employees ;
(可接受可选的LOCATION语句,但其他属性、包括表模式,都不能重新定义)
(2)
hive> show tables in mydb ;
hive> show tables 'empl.*' ;
(3)查看表详细信息
hive> DESCRIBE EXTENDED mydb.employees ; (可查看表 是管理表or外部表、显示分区键)
hive> DESCRIBE mydb.employees.salary ; (只看某一列信息)
(FORMATTED 换 EXTENDED,更细)
3. 分区
(1)
hive> SHOW PARTITIONS employees ;
hive> SHOW PARTITIONS employees PARTITION(country='US') ;
--------【Hive (3-4)】
1.《第三章 数据类型和文件格式》
(1)struct、map、array类型。
(struct中一旦声明好结构,那么其位置就不可以再改吧)
大多数关系型数据库不支持这些集合数据类型,因为使用它们会趋向于破坏标准格式。例如,在传统数据模型中,structs可能需要由多个不同的表拼装而成,表间需要适当地使用外键来进行连接。
(破坏标准格式带来的一个实际问题是会增大数据冗余的风险,进而导致消耗不必要的磁盘空间)
然而在大数据系统中,不遵循标准格式的一个好处就是可以提供更高吞吐量的数据。当处理的数据的数据级是T或P时,以最少的“头部寻址”来从磁盘上扫描数据是非常必要的。按照数据集进行封装的话可以通过减少寻址次数来提供查询的速度。而如果根据外键关系关联的话则需要进行磁盘间的寻址操作,这样会有非常高的性能消耗。
(提示:Hive中没有键的概念。但是,可以对表建立索引)
(2)ETL:数据抽取、数据转化、数据装载
(3) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' :
使用^A(ctrl+A)字符作为列分割符;
ROW FORMAT DELIMITED COLLECTION ITEMS TERMINATED BY '\002':
使用^B作为集合元素间的分割符。(包括map、struct中的各元素之间);
ROW FORMAT DELIMITED MAP KEYS TERMINATED BY '\003':
使用^C作为map中键和值之间的分割符。
LINES TERMINATED BY '...'和 STORED AS ...不需要ROW FROMAT DELIMITED关键字。
(Hive中行与行之间的分割符,目前只支持\n)
(4)
向传统数据库写入数据的几种方式:
a)装载外部数据;
b)将一个查询的输出结果写入 的方式;
c)使用update语句。等等
传统数据库对于存储具有完全的控制力。数据库就是“守门人”。
写时模式:数据在写入数据库时对模式进行检查。
读时模式:Hive不会在数据加载时进行验证,而是在查询时进行。(在查询时进行验证)
如果异常,如个数不匹配、类型不匹配等,会返回null值。此外,Hive会尽力将错误恢复过来
2. 《第四章 HiveQL:数据定义》
(1)Hive不支持行级插入操作、更新操作、删除操作。Hive也不支持事务。
(2)Hive中数据库的概念 本质上仅仅是表的一个目录或者命名空间。 避免表命名冲突
(3)在所有数据库相关的命令中,都可以使用SCHEMA关键字代替TABLE关键字。
(4)Hive会为每个数据库创建一个目录。数据库中的表将会以这个数据库目录的子目录的形式存储。 例外是default数据库中的表,这个数据库本身没有自己的目录。
(5)数据库所在目录:hive.metastore.warehouse.dir设定
默认是:/user/hive/warehouse
(1)Hive中没有一个命令可以让用户查看当前所在的是哪个数据库!唯一方法:
hive> set hive.cli.print.current.db = true;
(2)数据库的其它元素信息都是不可更改的,包括数据库名和数据库所在目录位置。
实在没办法,可以删除或者“重置”数据库属性。
DBPROPERTIES中的属性可以修改(待确定)
(3)
2. 《第四章 HiveQL:数据定义》
(1)Hive不支持行级插入操作、更新操作、删除操作。
(2)Hive中数据库概念的本质:仅仅是表的一个目录 或 命名空间。
(用数据库将生产表组织成逻辑组)
(3)分区表改变了Hive对数据存储的组织方式。