数据仓库Hive编程——HiveQL的数据定义(一):Hive中的数据库

网友投稿 215 2022-11-21

数据仓库Hive编程——HiveQL的数据定义(一):Hive中的数据库

分类目录:​​商业智能《数据仓库Hive编程》总目录​​相关文章:​​HiveQL的数据定义(一):Hive中的数据库​​​​HiveQL的数据定义(二):修改数据库​​​​HiveQL的数据定义(三):创建表​​​​HiveQL的数据定义(四):分区表和管理表​​​​HiveQL的数据定义(五):删除表​​​​HiveQL的数据定义(六):修改表​​HiveQL是Hive查询语言。和普遍使用的所有SQL方言一样,它不完全遵守任一种ANSI SQL标准的修订版。HiveQL可能和MySQL的方言最接近,但是两者还是存在显著性差异的。Hive不支持行级插入操作、更新操作和删除操作。Hive也不支持事务。Hive增加了在Hadoop背景下的可以提供更高性能的扩展,以及一些个性化的扩展,甚至还增加了一些外部程序。《HiveQL的数据定义》系列的内容是HiveQL所谓的数据定义语言部分,其用于创建、修改和删除数据库、表、视图、函数和索引。后面将会涉及到数据库和表,将会讨论视图有关内容,将讨论索引,会讲述到函数。Hive中数据库的概念本质上仅仅是表的一个目录或者命名空间。然而,对于具有很多组和用户的大集群来说,这是非常有用的,因为这样可以避免表命名冲突。通常会使用数据库来将生产表组织成逻辑组。如果用户没有显式指定数据库,那么将会使用默认的数据库​​default​​。下面这个例子就展示了如何创建一个数据库:hive> CREATE DATABASE financials;如果数据库​​financials​​已经存在的话,那么将会抛出一个错误信息。使用如下语句可以避免在这种情况下抛出错误信息:hive> CREATE DATABASE IF NOT EXISTS financials;虽然通常情况下用户还是期望在同名数据库已经存在的情况下能够抛出警告信息的,但是​​IF NOT EXISTS​​这个子句对于那些在继续执行之前需要根据需要实时创建数据库的情况来说是非常有用的。在所有的数据库相关的命令中,都可以使用​​SCHEMA​​​这个关键字来替代关键字​​TABLE​​。随时可以通过如下命令方式查看Hive中所包含的数据库:hive> SHOW DATABASES;defaultfinancialshive> CREATE DATABASE human_resources;hive> SHOW DATABASES;defaultfinancialshuman_resources如果数据库非常多的话,那么可以使用正则表达式匹配来筛选出需要的数据库名。下面这个例子展示的是列举出所有以字母​​h​​​开头,以其他字符结尾(即​​.*​​部分含义)的数据库名:hive> SHOW DATABASES LIKE 'h.*';human_resourceshive> ...Hive会为每个数据库创建一个目录。数据库中的表将会以这个数据库目录的子目录形式存储。有一个例外就是​​defaul​​t数据库中的表,因为这个数据库本身没有自己的目录。数据库所在的目录位于属性​​hive.metastore.warehouse.dir​​​所指定的顶层目录,假设用户使用的是这个配置项默认的配置,也就是​​/user/hive/warehouse​​​,那么当我们创建数据库​​financials​​​时,Hive将会对应地创建一个目录​​/user/hive/warehouse/financials.db​​​。这里请注意,数据库的文件目录名是以​​.db​​结尾的。用户可以通过如下的命令来修改这个默认的位置:hive> CREATE DATABASE financials  > LOCATION '/my/preferred/directory';用户也可以为这个数据库增加一个描述信息,这样通过​​DESCRIBE DATABASE ​​ 命令就可以查看到该信息。hive> CREATE DATABASE financials  > COMMENT 'Holds all financial tables';hive> DESCRIBE DATABASE financials;financials Holds all financial tables hdfs://master-server/user/hive/warehouse/financials.db从上面的例子中,我们可以注意到,​​DESCRIEB DATABASE​​​语句也会显示出这个数据库所在的文件目录位置路径。在这个例子中,URI格式是​​hdfs​​​。如果安装的是MapR,那么这里就应该是​​maprfs​​​。对于亚马逊弹性MapReduce(EMR)集群,这里应该是​​hdfs​​​,但是用户可以设置​​hive.metastore.warehouse.dir​​​为亚马逊S3特定的格式(例如,属性值设置为​​s3n://bucketname...​​​)。用户可以使用s3作为模式,但是如果使用新版的规则​​s3n​​会更好。前面​​DESCRIBE DATABASE​​​语句的输出中,我们使用了​​master-server​​​来代表URI权限,也就是说应该是由文件系统的“主节点”(例如,HDFS中运行NameNode服务的那台服务器)的服务器名加上一个可选的端口号构成的(例如,服​​务器名:端口号​​​这样的格式)。如果用户执行的是伪分布式模式,那么主节点服务器名称就应该是​​localhost​​​。对于本地模式,这个路径应该是一个本地路径,例如​​file:///user/hive/warehouse/financials.db​​。如果这部分信息省略了,那么Hive将会使用Hadoop配置文件中的配置项​​fs.default.name​​​作为master-server所对应的服务器名和端口号,这个配置文件可以在​​$HADOOP_HOME/conf​​这个目录下找到。需要明确的是,​​hdfs:///user/hive/warehouse/financials.db​​​和​​hdfs://master-server/user/hive/warehouse/financials.db​​​是等价的,其中​​master-server​​是主节点的DNS名和可选的端口号。为了保持完整性,当用户指定一个相对路径(例如,​​some/relative/path​​​)时,对于HDFS和Hive,都会将这个相对路径放到分布式文件系统的指定根目录下(例如,​​hdfs:///user/​​​)。然而,如果用户是在本地模式下执行的话,那么当前的本地工作目录将是​​some/relative/path​​的父目录。为了脚本的可移植性,通常会省略掉那个服务器和端口号信息,而只有在涉及到另一个分布式文件系统实例(包括S3存储)的时候才会指明该信息。此外,用户还可以为数据库增加一些和其相关的键值对属性信息,尽管目前仅有的功能就是提供了一种可以通过​​DESCRIBE DATABASE EXTENDED ​​语句显示出这些信息的方式:hive> CREATE DATABASE financials  > WITH DBPROPERTIES ('creator' = 'Mark Moneybags', 'date' = '2012-01-02');hive> DESCRIBE DATABASE financials;financials  hdfs://master-server/user/hive/warehouse/financials.dbhive> DESCRIBE DATABASE EXTENDED financials;financials  hdfs://master-server/user/hive/warehouse/financials.db {date=2012-01-02, creator=Mark Moneybags);USE命令用于将某个数据库设置为用户当前的工作数据库,和在文件系统中切换工作目录是一个概念:hive> USE financials;现在,使用像​​SHOW TABLES​​这样的命令就会显示当前这个数据库下所有的表。不幸的是,并没有一个命令可以让用户查看当前所在的是哪个数据库!幸运的是,在Hive中是可以重复使用USE…命令的,这是因为在Hive中并没有嵌套数据库的概念。我们还可以通过设置一个属性值来在提示符里面显示当前所在的数据库(Hive v0.8.0版本以及之后的版本才支持此功能):hive> set hive.cli.print.current.db=true;hive (financials)> USE default;hive (default)> set hive.cli.print.current.db=false;hive> ...最后,用户可以删除数据库:hive> DROP DATABASE IF EXISTS financials;​​IF EXISTS​​​子句是可选的,如果加了这个子句,就可以避免因数据库​​finanacials​​不存在而抛出警告信息。默认情况下,Hive是不允许用户删除一个包含有表的数据库的。用户要么先删除数据库中的表,然后再删除数据库;要么在删除命令的最后面加上关键字​​CASCADE​​,这样可以使Hive自行先删除数据库中的表:hive> DROP DATABASE IF EXISTS financials CASCADE;如果使用的是​​RESTRICT​​​这个关键字而不是​​CASCADE​​这个关键字的话,那么就和默认情况一样,也就是,如果想删除数据库,那么必须先要删除掉该数据库中的所有表。如果某个数据库被删除了,那么其对应的目录也同时会被删除。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot集成mybatis官方生成器
下一篇:朴素产品法(下)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~