hive UNION和子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive UNION和子查询相关的知识,希望对你有一定的参考价值。

参考技术A union用于联合多个select语句的结果集,合并为一个独立的结果集。当前只支持UNION ALL(bag union)。不能消除重复行,每个select语句返回的列的数量和名字必须一样,否则会抛出语法错误。

如果必须对union的结果集做一些额外的处理,整个语句可以被嵌入在from子句中。

子查询语法

Hive只在from子句中支持子查询。子查询必须给定一个名字,因为每个表在from子句中必须有一个名字。子查询的查询列表的列,必须有唯一的名字。子查询的查询列表在外面的查询是可用的,就向表的列。子查询也可以一个UNION查询表达式,Hive支持任意层次的子查询。

示例1:

示例2:

Hive 整合Hbase

摘要

Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询、同时也可以将hive表中的数据映射到Hbase中。

? ?

应用场景

2.1 将ETL操作的数据存入HBase

? ?

? ?

技术图片

?? ?

2.2 HBase作为Hive的数据源

? ?

技术图片

? ?

2.3 构建低延时的数据仓库

技术图片

环境准备

? ?

? ?

3.1 hive与hbase整合环境配置

  • 修改hive-site.xml文件,添加配置属性(zookeeper的地址)

    [root@hadoop01 conf]# vim hive-site.xml

<property>

<name>hbase.zookeeper.quorum</name>

<value>node1:2181,node2:2181,node3:2181</value>

</property>

? ?

  • 引入hbase的依赖包

    将hbase安装目录下的lib文件夹下的包导入到hive的环境变量中,在hive-env.sh 文件中添加

    [root@hadoop01 conf]# vim hive-env.sh

export HIVE_CONF_DIR=/usr/local/hive/conf

export HIVE_CLASSPATH=$HIVE_CLASSPATH:$HBASE_HOME/lib/*

? ?

至此、hive与hbase整合环境准备完成。

实战

4.1 hbase表映射到hive表中

  • 在hbase中创建表:表名hbase_test, 有三个列族 f1、f2、f3

    ? ?

create ‘hbase_test‘,{NAME => ‘f1‘,VERSIONS => 1},{NAME => ‘f2‘,VERSIONS => 1},{NAME => ‘f3‘,VERSIONS => 1}

? ?

技术图片

  • 插入数据

    ? ?

put ‘hbase_test‘,‘r1‘,‘f1:name‘,‘zhangsan‘

put ‘hbase_test‘,‘r1‘,‘f2:age‘,‘20‘

put ‘hbase_test‘,‘r1‘,‘f3:sex‘,‘male‘

put ‘hbase_test‘,‘r2‘,‘f1:name‘,‘lisi‘

put ‘hbase_test‘,‘r2‘,‘f2:age‘,‘30‘

put ‘hbase_test‘,‘r2‘,‘f3:sex‘,‘female‘

put ‘hbase_test‘,‘r3‘,‘f1:name‘,‘wangwu‘

put ‘hbase_test‘,‘r3‘,‘f2:age‘,‘40‘

put ‘hbase_test‘,‘r3‘,‘f3:sex‘,‘male‘

? ?

技术图片

? ?

? ?

  • 查询数据

    ? ?

    技术图片

    ? ?

  • 创建基于hbase的hive表

    ? ?

CREATE EXTERNAL TABLE hiveFromHbase(

rowkey string,

f1 map<STRING,STRING>,

f2 map<STRING,STRING>,

f3 map<STRING,STRING>

) STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")

TBLPROPERTIES ("hbase.table.name" = "hbase_test");

? ?

这里使用外部表映射到HBase中的表,这样,在Hive中删除表,并不会删除HBase中的表,否则,就会删除。另外,除了rowkey,其他三个字段使用Map结构来保存HBase中的每一个列族。

  • hbase.columns.mapping

    Hive表和HBase表的字段映射关系,分别为:Hive表中第一个字段映射:key(rowkey),第二个字段映射列族f1,第三个字段映射列族f2,第四个字段映射列族f3

  • hbase.table.name

    HBase中表的名字

    ? ?

  • hive中查询hbase表

    技术图片

    ? ?

    可以看到,Hive中有3行数据,因为有3个rowkey,每一个列族的列和值,分别被存储到Map结构中

    ? ?

  • Hive中插入数据到HBase表

    ? ?

insert into table hiveFromHbase

SELECT ‘r4‘ AS rowkey,

map(‘name‘,‘zhaoliu‘) AS f1,

map(‘age‘,‘50‘) AS f2,

map(‘sex‘,‘male‘) AS f3

from person limit 1;

? ?

插入成功后查看2张表的数据

? ?

hive表hiveFromHbase:

? ?

技术图片

? ?

Hbase表hbase_test:

? ?

技术图片

? ?

? ?

Hive中的外部表hiveFromHbase,就和其他外部表一样,只有一份元数据,真正的数据是在HBase表中,Hive通过hive-hbase-handler来操作HBase中的表。

? ?

? ?

4.2 hive表映射到hbase表中

  • 创建映射hbase的表

? ?

create table hive_test(

id string,

name string,

age int,

address string

)STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f2:age,f3:address")

TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive");

? ?

? ?

  • 查看hbase映射表是否产生

    技术图片

    ? ?

  • 查看hbase映射表的表结构和数据

    ? ?

    技术图片

    ? ?

    技术图片

    ? ?

    由于hive表中没有加载数据,此时hbase中映射的表也无数据

    ? ?

    ? ?

  • Hive表加载数据

    ? ?

    数据来源于另一张表hive_source;

    技术图片

查看hive_source的表结构和数据

? ?

加载数据:

insert overwrite table hive_test select * from hive_source;

? ?

? ?

  • 查看hive和hbase中表的数据

    技术图片

    ? ?

    技术图片

    ? ?

    映射表可以查看到hive表中的数据。

以上是关于hive UNION和子查询的主要内容,如果未能解决你的问题,请参考以下文章

使用UNION ALL和子查询和变量的MySQL错误

mysql性能分析工具

mysql中主查询和子查询关系是啥?

如何使用 UNION 和子 SELECT 从查询构造 MySQL 视图

说说 MySQL 子查询

MySQL 用 explain 关注哪些字段