大数据技术原理与应用第十四章基于Hadoop的数据仓库Hive学习指南

exportHIVE_HOME=/usr/local/hiveexportPATH=$PATH:$HIVE_HOME/binexportHADOOP_HOME=/usr/local/hadoopHADOOP_HOME需要被配置成你机器上Hadoop的安装路径,比如这里是安装在/usr/local./hadoop目录。保存退出后,运行如下命令使配置立即生效:

source~/.bashrc3.修改/usr/local/hive/conf下的hive-site.xml执行如下命令:

cd/usr/local/hive/confmvhive-default.xml.templatehive-default.xml上面命令是将hive-default.xml.template重命名为hive-default.xml;然后,使用vim编辑器新建一个配置文件hive-site.xml,命令如下:

cd/usr/local/hive/confvimhive-site.xml在hive-site.xml中添加如下配置信息:

tar-zxvfmysql-connector-java-5.1.40.tar.gz#解压cpmysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar/usr/local/hive/lib#将mysql-connector-java-5.1.40-bin.jar拷贝到/usr/local/hive/lib目录下3.启动并登陆mysqlshell

servicemysqlstart#启动mysql服务mysql-uroot-p#登陆shell界面4.新建hive数据库。

mysql>createdatabasehive;#这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据5.配置mysql允许hive接入:

mysql>grantallon*.*tohive@localhostidentifiedby'hive';#将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码mysql>flushprivileges;#刷新mysql系统权限关系表6.启动hive启动hive之前,请先启动hadoop集群。

start-all.sh#启动hadoophive#启动hive注意,我们这里已经配置了PATH,所以,不要把start-all.sh和hive命令的路径加上。如果没有配置PATH,请加上路径才能运行命令,比如,本教程Hadoop安装目录是“/usr/local/hadoop”,Hive的安装目录是“/usr/local/hive”,因此,启动hadoop和hive,也可以使用下面带路径的方式:

在启动Hive时,有可能会出现Hivemetastoredatabaseisnotinitialized的错误,这里给出解决方案。解决Hive启动,Hivemetastoredatabaseisnotinitialized的错误。出错原因:以前曾经安装了Hive或MySQL,重新安装Hive和MySQL以后,导致版本、配置不一致。解决方法是,使用schematool工具。Hive现在包含一个用于HiveMetastore架构操控的脱机工具,名为schematool.此工具可用于初始化当前Hive版本的Metastore架构。此外,其还可处理从较旧版本到新版本的架构升级。所以,解决上述错误,你可以在终端执行如下命令:

schematool-dbTypemysql-initSchema执行后,再启动Hive,应该就正常了。启动进入Hive的交互式执行环境以后,会出现如下命令提示符:

hive>可以在里面输入SQL语句,如果要退出Hive交互式执行环境,可以输入如下命令:

hive>exit;三、Hive的常用HiveQL操作1)Hive基本数据类型

首先,我们简单叙述一下HiveQL的基本数据类型。

Hive支持基本数据类型和复杂类型,基本数据类型主要有数值类型(INT、FLOAT、DOUBLE)、布尔型和字符串,复杂类型有三种:ARRAY、MAP和STRUCT。

a.基本数据类型

b.复杂数据类型

2)常用的HiveQL操作命令

Hive常用的HiveQL操作命令主要包括:数据定义、数据操作。接下来详细介绍一下这些命令即用法(想要了解更多请参照《Hive编程指南》一书)。

a.数据定义:主要用于创建修改和删除数据库、表、视图、函数和索引。

创建、修改和删除数据库

createdatabaseifnotexistshive;#创建数据库showdatabases;#查看Hive中包含数据库showdatabaseslike'h.*';#查看Hive中以h开头数据库describedatabases;#查看hive数据库位置等信息alterdatabasehivesetdbproperties;#为hive设置键值对属性usehive;#切换到hive数据库下dropdatabaseifexistshive;#删除不含表的数据库dropdatabaseifexistshivecascade;#删除数据库和它中的表注意,除dbproperties属性外,数据库的元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置,没有办法删除或重置数据库属性。

创建、修改和删除表

主要语法如下,用户可自行实现。

createviewview_nameas....;#创建视图alterviewview_namesettblproperties(…);#修改视图因为视图是只读的,所以对于视图只允许改变元数据中的tblproperties属性。

#删除视图dropviewifexistsview_name;#创建索引createindexindex_nameontabletable_name(partition_name/column_name)as'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'withdeferredrebuild....;这里'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'是一个索引处理器,即一个实现了索引接口的Java类,另外Hive还有其他的索引实现。

alterindexindex_nameontabletable_namepartition(...)rebulid;#重建索引如果使用deferredrebuild,那么新索引成空白状态,任何时候可以进行第一次索引创建或重建。

showformattedindexontable_name;#显示索引dropindexifexistsindex_nameontabletable_name;#删除索引用户自定义函数

在新建用户自定义函数(UDF)方法前,先了解一下Hive自带的那些函数。showfunctions;命令会显示Hive中所有的函数名称:

若想要查看具体函数使用方法可使用describefunction函数名:

首先编写自己的UDF前需要继承UDF类并实现evaluate()函数,或是继承GenericUDF类实现initialize()函数、evaluate()函数和getDisplayString()函数,还有其他的实现方法,感兴趣的用户可以自行学习。

另外,如果用户想在Hive中使用该UDF需要将我们编写的Java代码进行编译,然后将编译后的UDF二进制类文件(.class文件)打包成一个JAR文件,然后在Hive会话中将这个JAR文件加入到类路径下,在通过createfunction语句定义好使用这个Java类的函数。

addjar;#创建函数createtemporaryfunctionfunction_name;droptemporaryfunctionifexistsfunction_name;#删除函数3)数据操作

主要实现的是将数据装载到表中(或是从表中导出),并进行相应查询操作,对熟悉SQL语言的用户应该不会陌生。

向表中装载数据

这里我们以只有两个属性的简单表为例来介绍。首先创建表stu和course,stu有两个属性id与name,course有两个属性cid与sid。

createtableifnotexistshive.stu(idint,namestring)rowformatdelimitedfieldsterminatedby'\t';createtableifnotexistshive.course(cidint,sidint)rowformatdelimitedfieldsterminatedby'\t';向表中装载数据有两种方法:从文件中导入和通过查询语句插入。

a.从文件中导入

假如这个表中的记录存储于文件stu.txt中,该文件的存储路径为/usr/local/hadoop/examples/stu.txt,内容如下。

stu.txt:

1xiapi2xiaoxue3qingqing下面我们把这个文件中的数据装载到表stu中,操作如下:

loaddatalocalinpath'/usr/local/hadoop/examples/stu.txt'overwriteintotablestu;如果stu.txt文件存储在HDFS上,则不需要local关键字。

b.通过查询语句插入

使用如下命令,创建stu1表,它和stu表属性相同,我们要把从stu表中查询得到的数据插入到stu1中:

createtablestu1asselectid,namefromstu;上面是创建表,并直接向新表插入数据;若表已经存在,向表中插入数据需执行以下命令:

insertoverwritetablestu1selectid,namefromstuwhere(条件);这里关键字overwrite的作用是替换掉表(或分区)中原有数据,换成into关键字,直接追加到原有内容后。

从表中导出数据

a.可以简单拷贝文件或文件夹

命令如下:

hadoopfs-cpsource_pathtarget_path;b.写入临时文件

insertoverwritelocaldirectory'/usr/local/hadoop/tmp/stu'selectid,namefromstu;查询操作

和SQL的查询完全一样,这里不再赘述。主要使用select...from...where...等语句,再结合关键字groupby、having、like、rlike等操作。这里我们简单介绍一下SQL中没有的case...when...then...句式、join操作和子查询操作。

case...when...then...句式和if条件语句类似,用于处理单个列的查询结果,语句如下:

selectid,name,casewhenid=1then'first'whenid=2then'second'else'third'结果如下:

连接连接(join)是将两个表中在共同数据项上相互匹配的那些行合并起来,HiveQL的连接分为内连接、左向外连接、右向外连接、全外连接和半连接5种。

a.内连接(等值连接)内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

首先,我们先把以下内容插入到course表中(自行完成)。

132131下面,查询stu和course表中学号相同的所有行,命令如下:

selectstu.*,course.*fromstujoincourseon(stu.id=course.sid);执行结果如下:

selectstu.*,course.*fromstuleftouterjoincourseon(stu.id=course.sid);执行结果如下:

c.右连接右连接是左向外连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。命令如下:

selectstu.*,course.*fromsturightouterjoincourseon(stu.id=course.sid);执行结果如下:

d.全连接全连接返回左表和右表中的所有行。当某行在另一表中没有匹配行时,则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。命令如下:

selectstu.*,course.*fromstufullouterjoincourseon(stu.id=course.sid);执行结果如下:

e.半连接半连接是Hive所特有的,Hive不支持in操作,但是拥有替代的方案;leftsemijoin,称为半连接,需要注意的是连接的表不能在查询的列中,只能出现在on子句中。命令如下:

selectstu.*fromstuleftsemijoincourseon(stu.id=course.sid);执行结果如下:

子查询标准SQL的子查询支持嵌套的select子句,HiveQL对子查询的支持很有限,只能在from引导的子句中出现子查询。

注意,在定义或是操作表时,不要忘记指定所需数据库。

下面我们以词频统计算法为例,来介绍怎么在具体应用中使用Hive。词频统计算法又是最能体现MapReduce思想的算法之一,这里我们可以对比它在MapReduce中的实现,来说明使用Hive后的优势。

MapReduce实现词频统计的代码可以通过下载Hadoop源码后,在$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar包中找到(wordcount类),wordcount类由63行Java代码编写而成。下面首先简单介绍一下怎么使用MapReduce中wordcount类来统计单词出现的次数,具体步骤如下:

1)创建input目录,output目录会自动生成。其中input为输入目录,output目录为输出目录。命令如下:

cd/usr/local/hadoopmkdirinput2)然后,在input文件夹中创建两个测试文件file1.txt和file2.txt,命令如下:

cd/usr/local/hadoop/inputecho"helloworld">file1.txtecho"hellohadoop">file2.txt3)执行如下hadoop命令:

cd..hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jarwordcountinputoutput4)我们可以到output文件夹中查看结果,结果如下:

下面我们通过HiveQL实现词频统计功能,此时只要编写下面7行代码,而且不需要进行编译生成jar来执行。HiveQL实现命令如下:

createtabledocs(linestring);loaddatainpath'input'overwriteintotabledocs;createtableword_countasselectword,count(1)ascountfrom(selectexplode(split(line,''))aswordfromdocs)wgroupbywordorderbyword;执行后,用select语句查看,结果如下:

由上可知,采用Hive实现最大的优势是,对于非程序员,不用学习编写JavaMapReduce代码了,只需要用户学习使用HiveQL就可以了,而这对于有SQL基础的用户而言是非常容易的。

THE END
1.MySQL中文网Mysql官网联系MySQL|登录|注册 MySQL HeatWave MySQL数据库服务是一个完全托管的数据库服务,可使用世界上最受欢迎的开源数据库来部署云原生应用程序。 它是百分百由MySQL原厂开发,管理和提供支持。 了解更多信息 ? MySQL 企业版 全面的高级功能、管理工具和技术支持,可实现高水平的 MySQL 可扩展性、安全性、可靠性和无故障http://mysql.p2hp.com/index.html
2.Mysql知识详解(内容非常丰富)mysql常用的引擎Read Uncommitted(读取未提交内容——脏读):在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满https://blog.csdn.net/a342874650/article/details/134985437
3.MySQL::MySQLDocumentationAccelerate query performance with HeatWave MySQL Query data in object storage and MySQL with HeatWave Lakehouse Automate the machine learning pipeline with HeatWave AutoML MySQL 8.4Reference ManualMySQL 8.4Release Notes MySQL Server & MySQL Cluster https://dev.mysql.com/doc/
4.MySQL是什么?架构是怎么样的?这次我们要加的中间层是 mysql。 mysql是数据和应用的中间层 什么是 mysql Mysql数据库,是一款存放和管理数据的软件, 它介于应用和数据之间,通过一些设计,将大量数据,变成一张张像 excel 的数据表。为应用提供创建(Create), 读取(Read), 更新(Update), 删除(Delete)等核心操作。 https://www.51cto.com/article/803939.html
5.了解数据库技术:SQLite与MySQL的比较让我们比较一下两个最流行的开源管理系统–MySQL与SQLite–详细说明它们是如何工作的,它们的根本区别,优点和缺点,最后,对于WordPress托管的网络应用来说,哪个更合适。 使用开源数据库的好处 什么是SQLite? 什么是MySQL? 用例分析 两者优点和缺点 哪个更适合WordPress? https://www.wbolt.com/sqlite-vs-mysql.html
6.MYSQL简介MYSQL数据库MYSQL品牌简介,十大品牌网为你介绍甲骨文(中国)软件系统有限公司旗下MYSQL品牌信息,包括品牌介绍、联系方式、主营产品、最新评论、点赞数量等,告诉你MYSQL数据库怎么样,致力于帮助你了解MYSQL真实有效的品牌相关信息。https://www.cnpp.cn/pinpai/4117067.html
7.PHP创建MySQL数据库数据库存有一个或多个表。创建数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库。 语法 CREATE DATABASE database_name 为了让 PHP 执行上面的语句,我们必须使用 mysql_query() 函数。此函数用于向 MySQL 连接发送查询或命令。 例子 在下面的例子中,我们创建了一个名为 "my_db" 的数据库: <?php $https://www.w3school.com.cn/php/php_mysql_create.asp
8.MySQL创建数据库及简单增删改查使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。 在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。 drop 命令删除数据库 drop 命令格式: https://www.jianshu.com/p/db57844594a1
9.MySQL创建数据库和创建数据表的操作过程Mysql使用create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码。 1 create database MyDB_two character set utf8; 直接创建的数据库,数据库的编码方式是 MySQL 默认的编码方式 latin1 (单字节编码) ,通常我们会在数据库中存放中文数据,所以最好把数据库的编码方式设置成 utf-8 ,这样https://www.jb51.net/article/266960.htm
10.AzureDatabaseforMySQL了解MySQL 数据库,它是一款面向应用开发人员的完全托管数据库服务。Azure 是一个可满足你所有数据库需求的托管服务提供商。https://azure.microsoft.com/zh-cn/services/mysql/
11.MySQL的安装和配置(超详细图文教程)「建议收藏」4.选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),按“Next”继续。 https://cloud.tencent.com/developer/article/2065168
12.mysqli类PHP:mysqlimysqli::$insert_id— 返回上次查询为 AUTO_INCREMENT 列生成的值 mysqli::kill— 让服务器杀死一个 MySQL 线程 mysqli::more_results— 检查批量查询中是否还有查询结果 mysqli::multi_query— 在数据库上执行一个或多个查询 mysqli::next_result— 为读取 multi_query 执行之后的下一个结果集做准备 https://www.php.net/manual/zh/class.mysqli.php
13.navicat修改版下载中文版navicatformysql下载Navicat Premium是一个可多重连接的数据库管理工具,它可让你以单一程序同时连接;Navicat for MySQL是一套专为 MySQL 设计的高性能数据库管理及开发工具。绿色资源网提供navicat for mysql修改版、navicat premium注册码、navicat premium mac版等,希望对大家有帮助! 其他数据库软件推荐:access、sql server、mysql、http://www.downcc.com/k/navicat/
14.MySQL中文文档MySQL中文网MySQL 5.1中文文档 第1章:一般信息 第2章:安装MySQL 第3章:教程 第4章:MySQL程序概述 第5章:数据库管理 第6章:MySQL中的复制 第7章:优化 第8章:客户端和实用工具程序 第9章:语言结构 第10章:字符集支持 第11章: 列类型 第12章: 函数和操作符 https://www.mysqlzh.com/