Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在hadoop 分布式文件系统中的数据。其在Hadoop的架构体系中承担了一个SQL解析的过程,它提供了对外的入口来获取用户的指令然后对指令进行分析,解析出一个MapReduce程序组成可执行计划,并按照该计划生成对应的MapReduce任务提交给Hadoop集群处理,获取最终的结果。元数据——如表模式——存储在名为metastore的数据库中。
系统环境ip地址1 hadoop-master
ip地址2 hadoop-slave
MySQL安装在master机器上,hive服务器也安装在master上
Hive下载下载源码包,最新版本可自行去官网下载
[hadoop@hadoop-master ~]$ wget hive的下载地址[hadoop@hadoop-master ~]$ tar -zxf apache-hive-1.2.1-bin.tar.gz
[hadoop@hadoop-master ~]$ ls
apache-hive-1.2.1-bin apache-hive-1.2.1-bin.tar.gz dfs hadoop-2.7.1 Hsource tmp12341234 配置环境变量 [root@hadoop-master hadoop]# vi /etc/profile
HIVE_HOME=/home/hadoop/apache-hive-1.2.1-bin
PATH=$PATH:$HIVE_HOME/bin
export HIVE_NAME PATH Metastore
metastore是hive元数据集中存放地。它包括两部分:服务和后台数据存储。有三种方式配置metastore:内嵌metastore、本地metastore以及远程metastore。
本次搭建中采用MySQL作为远程仓库,部署在hadoop-master节点上,hive服务端也安装在hive-master上,hive客户端即hadoop-slave访问hive服务器。
创建Hive用户 mysql>CREATE USER 'hive' IDENTIFIED BY 'hive'mysql>GRANT ALL PRIVILEGES ON *.* TO 'hive'@'hadoop-master' WITH GRANT OPTION
mysql>flush privileges123123 Hive用户登录 [hadoop@hadoop-master ~]mysql -h hadoop-master -uhive
mysql>set password = password('hive')1212 创建Hive数据库 mysql>create database hive 配置Hive
修改配置文件
进入到hive的配置文件目录下,找到hive-default.xml.template,cp份为hive-default.xml
另创建hive-site.xml并添加参数
[hadoop@hadoop-master conf]$ pwd/home/hadoop/apache-hive-1.2.1-bin/conf
[hadoop@hadoop-master conf]$ vi hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-master:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive<value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
</configuration> Hive客户端配置 [hadoop@hadoop-master ~]$ scp -r apache-hive-1.2.1-bin/ hadoop@hadoop-slave:/home/hadoop
[hadoop@hadoop-slave conf]$ vi hive-site.xml
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop-master:9083</value>
</property>
</configuration> Hive启动
要启动metastore服务
[hadoop@hadoop-master ~]$ hive --service metastore &[hadoop@hadoop-master ~]$ jps
10288 RunJar #多了一个进程
9365 NameNode
9670 SecondaryNameNode
11096 Jps
9944 NodeManager
9838 ResourceManager
9471 DataNode Hive服务器端访问 [hadoop@hadoop-master ~]$ hive
Logging initialized using configuration in jar:file:/home/hadoop/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show databases
OK
default
src
Time taken: 1.332 seconds, Fetched: 2 row(s)
hive> use src
OK
Time taken: 0.037 seconds
hive> create table test1(id int)
OK
Time taken: 0.572 seconds
hive> show tables
OK
abc
test
test1
Time taken: 0.057 seconds, Fetched: 3 row(s)
hive> Hive客户端访问 [hadoop@hadoop-slave conf]$ hive
Logging initialized using configuration in jar:file:/home/hadoop/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show databases
OK
default
src
Time taken: 1.022 seconds, Fetched: 2 row(s)
hive> use src
OK
Time taken: 0.057 seconds
hive> show tables
OK
abc
test
test1
Time taken: 0.218 seconds, Fetched: 3 row(s)
hive> create table test2(id int ,name string)
OK
Time taken: 5.518 seconds
hive> show tables
OK
abc
test
test1
test2
Time taken: 0.102 seconds, Fetched: 4 row(s)
Hive中可以通过hive-hbase-handler建立指向HBase表的外部表,通过在Hive中往该外部表insert数据,即可完成向HBase中插入数据。你可以搜索"lxw的大数据田地 hive
hbase整合",里面有文章介绍Hive和HBase的整合。
前面我们一起学习了with cube等多维分析语法,细心的你可能会发现,通过数据魔方查询出来的维度数据除了用grouping_id可以区分出当条记录的维度信息。如果不用grouping_id区分那么在维度表现上看无维度的数据默认都会被置为null(空值)。假如恰巧维度数据中本身就有空值那么查询的结果就会变得混乱。那么怎么解决这个问题呢?
1.确定维度为空值的的记录无效的话,可以在查询条件中过滤掉这些数据。
2. 利用空值处理函数,将空值转换成特殊值。
下面介绍一下空值的判断与处理函数:
NVL用法: nvl(expr1,expr2) 如果表达式1不为null返回表达式1的值,如果为空,则返回表达式2值。一般表达式2设为了下缺省值 如:select nvl(status,0)
Coalesce用法:coalesce(expr1,expr2,expr3,.....) 返回第一个不为null的值,可以说是nvl升级版,它可以有多个表达式。为了保证不为空,最后一个表达式最好写一个缺省值。
isnull用法:isnull(expr1) 判断表达式是否为空值,返回布尔类型true或false。判空函数,当然不用它也可以比如 tbl.status is null 或 tbl.status is not null 这样写来判断是空还是非空。
IF用法: if(booleanexpr,expr1,expr2) ,布尔表达式为true 返回 expr1,否则返回expr2。if函数除了处理空值外,还可以对字段进行逻辑加工。
NULLIF用法 nullif(expr1,expr2) ,如果表达式1=表达式2 返回null 否则返回表达式1
利用上面的函数可以对多维分析中的原始维度值的空值进行了处理,假设我们又不用grouping_id列,用来来区分维度,那么多维分析中产生的维度空值要怎么处理才能方便后续用于报表展现呢?
一种方法就是把cube多维度查询产生的null用上面的函数转换成一些固定的值,如'all'、 -1、-9999等和原始维度值无冲突的值,方便前端报表查询时将无条件的数据用-1、-9999或者'all'之类的进行查询和替换。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)