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.分区表 外部分区表 关联查询的更多相关文章

  1. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  2. mybatis入门篇:Mapper接口/关联查询/新增数据

    1.数据准备 2.编写实体类 package com.forest.owl.entity; import java.util.Date; public class User { private Lon ...

  3. Hive管理表,外部表及外部分区表的深入探讨

    Hive管理表,也叫内部表.Hive控制着管理表的整个生命周期,默认情况下Hive管理表的数据存放在hive的主目录:/user/hive/warehouse/下,并且当我们删除一张表时,这张表的数据 ...

  4. hive 四种表,分区表,内部,外部表,桶表

    Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具 ...

  5. Hive内部表,外部表和分区表

    外部表和内部表的区别 内部表也称之为managed_table: 默认存储在/user/hive/warehouse下,也可以通过location指定: 删除表事,会删除表数据以及元数据: 外部表称之 ...

  6. 第2节 hive基本操作:10、外部分区表综合练习

    外部分区表综合练习: 需求描述:现在有一个文件score.csv文件,存放在集群的这个目录下/export/servers/scoredatas/month=201806,这个文件每天都会生成,存放到 ...

  7. 【HIVE】(2)分区表、二级分区、动态分区、分桶、抽样

    分区表: 建表语句中添加:partitioned by (col1 string, col2 string) create table emp_pt(id int, name string, job ...

  8. MyBatis入门(二)—— 输入映射和输出映射、动态sql、关联查询

    一.输入映射和输出映射 1. parameterType(输入类型) 1.1 传递简单类型 <select id="getUserById" parameterType=&q ...

  9. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

随机推荐

  1. CodeForces 939F Cutlet

    洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译. 这是一道毒瘤的div. 2 F,我是不可能比赛的时候做出来的... (以下设两面都要煎\(n\)分钟,有\(m ...

  2. 消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!

    前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的Act ...

  3. C#_会员管理系统

    https://www.cnblogs.com/start-from-scratch/p/5420588.html

  4. Java-Servlet请求方式doXXX、service 具体分析

    说起Servlet的接收处理请求的方式,想必各位都并不陌生,如doGet.doPost.service... 那么他们的背后是如何执行?服务器怎么选择知道的?我们就此来探讨一下 本节案例的代码奉上: ...

  5. Luogu P1462 && P1951

    首先有两个最短路,可以考虑把一个东西拿出来二分,也就是可以二分最小值,但是注意不要用SPFA他死了,可以用Dij跑最短路,再二分,效率会大大提高 1.SPFA #include<bits/std ...

  6. 解读BloomFilter算法(转载)

    1.介绍 BloomFilter(布隆过滤器)是一种可以高效地判断元素是否在某个集合中的算法. 在很多日常场景中,都大量存在着布隆过滤器的应用.例如:检查单词是否拼写正确.网络爬虫的URL去重.黑名单 ...

  7. Java 操作Word书签(二):添加文本、图片、表格到书签内容

    在Java操作Word书签(一)中介绍了给Word中的特定段落或文字添加书签.读取及删除已有书签的方法,本文将继续介绍Java 操作Word书签的方法,即如何给已有的书签添加内容,包括添加文本.图片. ...

  8. Django--路由层、伪静态页面、虚拟环境、视图层

    路由层: 在路由匹配的时候,第一个参数是一个正则表达式,这也就意味着在路由匹配的时候按照正则匹配的规则去匹配,路由匹配的顺序是从上往下依次匹配的,只要匹配到一个,就会执行对应的函数,就不会执行下面的函 ...

  9. python 35 多线程

    目录 多线程 1. 线程 2. 线程vs进程 3. 开启线程的两种方法. 4. 线程的特性 5. 线程的相关方法 6. join 阻塞 7. 守护线程 daemon 8. 互斥锁 多线程 1. 线程 ...

  10. [目录] ASP.Net Core 搭建微服务网站

    本项目采用ASP.Net Core微服务技术,搭建博客和Saas平台. 全文将围绕(1)设计模式  (2)敏捷开发 目的: 结构足够合理,代码足够优美,扩展性.可读性.易维护性做到最优. 以下目录仅为 ...