《Hive》(4)

本文介绍Hive中的数据库和表管理,包括数据库的概念、创建、修改和删除,以及表的创建、复制和查看等操作。同时探讨了Hive不支持的行级操作,并解释了Hive如何处理数据存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

《第四章 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对数据存储的组织方式。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值