Hive入门--2.分区表 外部分区表 关联查询
1.查看mysql中metastore数据存储结构
Metastore中只保存了表的描述信息(名字,列,类型,对应目录)
使用SQLYog连接itcast05 的mysql数据库
查看hive数据库的表结构:
2.建表(默认是内部表(先建表,后有数据))
(建表时必须指定列的分隔符)
create table trade_detail(
id bigint,
account string,
income double,
expenses double,
time string)
row format delimited fields terminated by '\t';
3.Hive状态下执行Hadoop hdfs命令
在使用hive shell 的时候,我们有时候需要操作hdfs
Hive为我们提供了在hive命令行下hdfs的shell:
,例如:
dfs -ls /;
dfs -mkdir /data;
dfs -put /root/student.txt;
用法和hdfs下是一样的,只是细微的差别
和Hadoop命令稍微有些差别,前面是dfs开头,后面以“;”结尾
4.创建–外部表(先有数据,后建表)
先上传数据文件 a.txt b.txt 到hdfs:/data目录下,
a.txt 和 b.txt 中的内容都是:
后执行创建表的命令:
create external table ext_student (
id int,
name string)
row format delimited fields terminated by '\t'
location '/data';
创建完成后使用命令:select * from ext_student; 查看表中内容:
再次上传数据文件 pep.avi
到 hdfs:/data 目录下,后执行全表扫描:select * from ext_student;
说明:只要将这个数据放到 hdfs:/data 表所指定的目录下,hive就能将这个表中的数据读取出来(内部表和外部表都支持,但也存在特殊情况读不出)
为什么把文件丢到对应目录下就能把数据读出来?
答:因为metastore记录了这张表和数据的映射关系
SDS表中的内容:
5.创建–分区表
建分区表是为了提高数据的查询效率,按照省份、年份、月份等分区
创建一个外部分区表(External Table ):
(表名:beauties 指向文件:beauty)
create external table beauties (
id bigint,
name string,
size double)
partitioned by (nation string)
row format delimited fields terminated by ‘\t’
location ‘/beauty’ ;
show create table beauties;
执行完成之后发现hdfs根目录下有beauty文件夹。
准备好3个数据文件: b.c b.j b.a
载入数据文件,同时指定分区:
load data local inpath '/root/b.c' into table beauties partition (nation='China');
查看表中是否成功load数据:
突发奇想:能否像平常使用外部表一样,在 hdfs:/beauty 目录下创建一个文件夹 nation=Japan ,然后将b.j 文件上传到这个目录下,数据就可以查出来了?
答:不行! 因为在载入数据的时候,metastore是不知道你将这个文件放到 /beauty/nation=Japan/ 目录下的。
拯救方法:通知hive在元数据库中添加一个beauties表的分区记录
alter table beauties add partition (nation=’Japan’) location “/beauty/nation=Japan/”
添加分区后,metastore中SDS表多了一条 记录:
再次查询beauties表,发现b.j中的数据也能查询出来了:
分区表的使用优势:
select * from beauties where nation=’China’;
在数据量很大的时候,建分区表可以提高查询效率,就不需要将整张表数据筛选对比之后再输出,因为数据在hdfs中直接是以分区存储的,所以使用类似”nation”等分区字段是可以直接把数据取出的
删除分区:
alter table beauties drop if exists partition (nation ='Japan') ;
注:这里的 if exists 字段呢,是一个检查分区是否存在的字段,存在则删除,不存在也不会报错说分区不存在啦
建内部分区表(Managed Table)
create table td_part(
id bigint,
account string,
income double,
expenses double,
time string)
partitioned by (logdate string)
row format delimited fields terminated by '\t';
普通表和分区表区别:有大量数据增加的需要建分区表
create table book (
id bigint,
name string)
partitioned by (pubdate string)
row format delimited fields terminated by '\t';
分区表加载数据
(hive自己的语法)
load data local inpath './book.txt'
overwrite into table book
partition (pubdate='2010-08-22');
local inpath –>从本地磁盘加载,不是hdfs
overwrite –>以覆盖的方式将数据写入book表中
以下创建表的方式少了“overwrite”,则是以追加方式将数据加载到hive表中:
load data local inpath '/root/data.am'
into table beauty
partition (nation="USA");
使用分区字段查询表中的数据
select nation, avg(size) from beauties group by nation order by avg(size);
6. 表关联查询
查询举例:
需求:
对 trade_detail 按照账户进行分组,求出每个账户的总支出总结余,然后和 user_info 进行表关联,取出名称。
在mysql中一条查询语句就能完成关联查询:
select t.account,u.name,t.income, t.expenses, t.surplus
from user_info u join (
select account,sum(income) as income,sum(expenses) as expenses,sum(income-expenses) as surplus
from trade_detail group by account
) t
on u.account = t.account
但是数据量一大,这个查询过程将变得极其漫长
所以我们使用hive来完成:
a) 首先要将2张表中的数据导入hdfs中,同样,我们也可以将mysql中的数据直接导入到hive表里面:
Mysql中的表: trade_detail表:
user_info表:
b) 在hive中创建表
trade_detail表:
create table trade_detail (
id bigint,
account string,
income string,
expenses string ,
times string)
row format delimited fields terminated by ‘\t’;
user_info表:
create table user_info (
id int,
account string,
name string,
age int)
row format delimited fields terminated by ‘\t’;
c) 使用Sqoop 将mysql中trade_detail的数据导入hive中
./sqoop import
--connect jdbc:mysql://192.168.1.102:3306/itcast
--username root
--password 123
--table trade_detail
--hive-import
--hive-overwrite
--hive-table trade_detail
--fields-terminated-by '\t';
可能会出现如下的错误:
原因是没有将hive添加到环境变量:
解决:
1)编辑 /etc/profile 文件,添加HIVE_HOME:
2)source /etc/profile 刷新配置
3)使用 which 命令查看是否添加成功:
ok
4)再次执行sqoop命令,发现sqoop导入正在执行,可以看到map-reduce工作正在执行,在web浏览器上查看执行完成之后的结果文件:
Sqoop导入执行成功!
d) 使用Sqoop 将mysql中user_info的数据导入hive的user_info中
./sqoop import
--connect jdbc:mysql://192.168.1. 102:3306/itcast
--username root
--password 123
--table user_info
--hive-import
--hive-overwrite
--hive-table user_info
--fields-terminated-by '\t';
e) hive执行关联查询语句之后的结果:
select t.account,u.name,t.income, t.expenses, t.surplus
from user_info u join (
select account,sum(income) as income,sum(expenses) as expenses,sum(income-expenses) as surplus
from trade_detail group by account
) t
on u.account = t.account;
经验证,这样的查询结果和在mysql中执行的结果是相同的
Hive入门--2.分区表 外部分区表 关联查询的更多相关文章
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- mybatis入门篇:Mapper接口/关联查询/新增数据
1.数据准备 2.编写实体类 package com.forest.owl.entity; import java.util.Date; public class User { private Lon ...
- Hive管理表,外部表及外部分区表的深入探讨
Hive管理表,也叫内部表.Hive控制着管理表的整个生命周期,默认情况下Hive管理表的数据存放在hive的主目录:/user/hive/warehouse/下,并且当我们删除一张表时,这张表的数据 ...
- hive 四种表,分区表,内部,外部表,桶表
Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具 ...
- Hive内部表,外部表和分区表
外部表和内部表的区别 内部表也称之为managed_table: 默认存储在/user/hive/warehouse下,也可以通过location指定: 删除表事,会删除表数据以及元数据: 外部表称之 ...
- 第2节 hive基本操作:10、外部分区表综合练习
外部分区表综合练习: 需求描述:现在有一个文件score.csv文件,存放在集群的这个目录下/export/servers/scoredatas/month=201806,这个文件每天都会生成,存放到 ...
- 【HIVE】(2)分区表、二级分区、动态分区、分桶、抽样
分区表: 建表语句中添加:partitioned by (col1 string, col2 string) create table emp_pt(id int, name string, job ...
- MyBatis入门(二)—— 输入映射和输出映射、动态sql、关联查询
一.输入映射和输出映射 1. parameterType(输入类型) 1.1 传递简单类型 <select id="getUserById" parameterType=&q ...
- Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!
之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...
随机推荐
- CodeForces 939F Cutlet
洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译. 这是一道毒瘤的div. 2 F,我是不可能比赛的时候做出来的... (以下设两面都要煎\(n\)分钟,有\(m ...
- 消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!
前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的Act ...
- C#_会员管理系统
https://www.cnblogs.com/start-from-scratch/p/5420588.html
- Java-Servlet请求方式doXXX、service 具体分析
说起Servlet的接收处理请求的方式,想必各位都并不陌生,如doGet.doPost.service... 那么他们的背后是如何执行?服务器怎么选择知道的?我们就此来探讨一下 本节案例的代码奉上: ...
- Luogu P1462 && P1951
首先有两个最短路,可以考虑把一个东西拿出来二分,也就是可以二分最小值,但是注意不要用SPFA他死了,可以用Dij跑最短路,再二分,效率会大大提高 1.SPFA #include<bits/std ...
- 解读BloomFilter算法(转载)
1.介绍 BloomFilter(布隆过滤器)是一种可以高效地判断元素是否在某个集合中的算法. 在很多日常场景中,都大量存在着布隆过滤器的应用.例如:检查单词是否拼写正确.网络爬虫的URL去重.黑名单 ...
- Java 操作Word书签(二):添加文本、图片、表格到书签内容
在Java操作Word书签(一)中介绍了给Word中的特定段落或文字添加书签.读取及删除已有书签的方法,本文将继续介绍Java 操作Word书签的方法,即如何给已有的书签添加内容,包括添加文本.图片. ...
- Django--路由层、伪静态页面、虚拟环境、视图层
路由层: 在路由匹配的时候,第一个参数是一个正则表达式,这也就意味着在路由匹配的时候按照正则匹配的规则去匹配,路由匹配的顺序是从上往下依次匹配的,只要匹配到一个,就会执行对应的函数,就不会执行下面的函 ...
- python 35 多线程
目录 多线程 1. 线程 2. 线程vs进程 3. 开启线程的两种方法. 4. 线程的特性 5. 线程的相关方法 6. join 阻塞 7. 守护线程 daemon 8. 互斥锁 多线程 1. 线程 ...
- [目录] ASP.Net Core 搭建微服务网站
本项目采用ASP.Net Core微服务技术,搭建博客和Saas平台. 全文将围绕(1)设计模式 (2)敏捷开发 目的: 结构足够合理,代码足够优美,扩展性.可读性.易维护性做到最优. 以下目录仅为 ...