大数据分析利器之hive
1、分桶表 知道
2、修改表结构 了解一下
3、数据导入几种方式 掌握
4、数据导出 了解
5、hive的静态分区以及动态分区 知道
6、基本的查询语法 掌握
7、jdbc操作 了解
8、dbbeaver使用 了解
目录
目录
1.3 常用函数 count max min sum avg
一、hive的分桶表
分区表是分文件夹
分桶表:直接对数据进行分桶,分成多个文件,每个文件里面保存部分数据,到时候如果需要获取数据的时候,可以直接从对应的文件里面获取即可
可以过滤掉大量不相关的文件,提高查询效率
分桶表就是分文件,将一个大的文件分成多个小的文件,提高查询效率
1.1、分桶表概述
-
分桶是相对分区进行更细粒度的划分。
-
==分桶将整个数据内容安装某列属性值取hash值进行区分,具有相同hash值的数据进入到同一个文件中==
-
比如按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
-
取模结果为==0==的数据记录存放到一个文件
-
取模结果为==1==的数据记录存放到一个文件
-
取模结果为==2==的数据记录存放到一个文件
-
取模结果为==3==的数据记录存放到一个文件
-
-
-
==分桶的作用==
-
1、取样sampling更高效。没有分区的话需要扫描整个数据集。
-
2、提升某些查询操作效率,例如map side join
-
-
分桶后不是加大了hadoop的存储量? hadoop不是对少数的大文件最有效吗?
-
实际工作当中你需要控制桶的数量,尽量保证每个桶里面的数据量比较接近128M
1280M的文件==》划分10个桶比较合理 set mapreduce.job.reduces=10;
-
-
设置reduce个数为3个分4桶会怎么样 ==》会报错 reducetask的个数 >= 桶的个数
-
这里分桶表不可以直接load么 ?
-
不行,直接load是一整个文件,需要将文件打散,需要使用mr的程序
直接load没有执行mr的程序没法打散
-
-
数据文件太大会导致什么样的情况呢,除了查询慢还有什么么 查询比较慢
-
如果reduce个数大于桶数会出现空文件么 会出现
-
修改桶数后还需要什么操作呢?会自动重新分桶吗
需要重新insert overwrite select 操作 -
分桶表的数据只能insert吗 对对对
-
load 操作底层不是 MR操作?
-
不是的 只是将文件移动到hdfs对应的文件夹下面去了
-
-
每次插入表都是新增一个文件,为什么不直接在一个文件下追加呢
-
hadoop没有提供mr追加的操作
追加会产生什么问题??? 涉及到block块的操作,更改block块的内容涉及到元数据更改==》非常麻烦
-
-
是不是创建表并没有与文件形成映射,加载数据之后映射才会形成?
不是的 创建表的时候已经指定了hdfs文件存储的位置,你只需要通过load将文件移动到hdfs指定的位置即可 -
什么时候在HDFS创建分桶的文件夹及文件?
分桶表比较特殊,不能使用load,只能通过insert select方式加载数据
创建表的时候已经创建了文件夹,通过insert select的时候才创建文件 -
把文件传过去以后不用MSCK REPAIR TABLE吗?
-
不用,只有分区表需要修复,如果是个分区表,放到文件夹之后还得刷一下元数据
-
-
那为什么分区表需要刷新,普通的不需要刷新 ?
-
这个就是分区表的特殊性 分区表元数据信息需要刷新到mysql里面去,
-
分区表比较特殊:有子文件夹
内部表 外部表 分桶表都没有子文件夹
-
-
-
是不是可以在分区的基础上进行分桶?
-
对的,可以继续分桶的,内部分区分桶表 外部分区分桶表
-
分区分桶表:先对数据进行分文件夹,分了文件夹之后再进行划分桶
-
-
-
从hdfs上导出时,如果是在不同的分区表中,是不是需要加上hdfs的路径呢
-
不需要,只需要指定分区条件即可 select * from user where month = '201809' or month = '201810'
-
-
1.2、案例演示
-
1、创建分桶表
-
在创建分桶表之前要执行的命令
-
set hive.enforce.bucketing=true; == 开启对分桶表的支持
-
set mapreduce.job.reduces=4; == 设置与桶相同的reduce个数(默认只有一个reduce)
-
mr的输出,一个reduceTask会输出一个文件
-
-
# 进入hive客户端然后执行以下命令
-
use myhive;
-
set mapreduce.job.reduces=4;
-
set hive.enforce.bucketing=true;
-
-
--分桶表 create table myhive.user_buckets_demo(id int, name string) clustered by(id) into 4 buckets row format delimited fields terminated by '\t'; --表示按照id进行hashCode取值 % 4 确定每一条数据需要去到哪一个文件里面去 --就是前面的mr当中的分区的操作 --普通表 create table user_demo(id int, name string) row format delimited fields terminated by '\t';
-
2、准备数据文件 buckets.txt
-
#在linux当中执行以下命令 cd /kkb/install/hivedatas/ vim user_bucket.txt 1 laowang1 2 laowang2 3 laowang3 4 laowang4 5 laowang5 6 laowang6 7 laowang7 8 laowang8 9 laowang9 10 laowang10
-
-
load data local inpath '/kkb/install/hivedatas/user_bucket.txt' overwrite into table user_demo; ---在hive客户端当中加载数据 load data local inpath '/kkb/install/hivedatas/user_bucket.txt' into table user_demo;
-
4、加载数据到桶表user_buckets_demo中
insert into table user_buckets_demo select * from user_demo;
-
5、hdfs上查看表的数据目录
-
6、抽样查询桶表的数据
-
tablesample抽样语句,语法:tablesample(bucket x out of y)
-
x表示从第几个桶开始取数据
-
y表示桶数的倍数,一共需要从 ==桶数/y== 个桶中取数据
-
-
select * from user_buckets_demo tablesample(bucket 1 out of 2)
-- 需要的总桶数=4/2=2个
-- 先从第1个桶中取出数据
-- 再从第1+2=3个桶中取出数据
二、Hive表的DDL操作
2.1、Hive修改表结构
修改表名称语法
alter table old_table_name rename to new_table_name;
2.1.1、 修改表的名称
alter table stu3 rename to stu4;
2.2 表的结构信息
hive> desc stu4;
hive> desc formatted stu4;
2.3 增加/修改/替换列信息
-
增加列
hive> alter table stu4 add columns(address string);
-
修改列
hive> alter table stu4 change column address address_id int;
三、Hive数据导入
从hdfs上导出时,如果是在不同的分区表中,是不是需要加上hdfs的路径呢
不需要,只需要指定分区条件即可 select * from user where month = '201809' or month = '2018
导出来的是一个文件夹还是一个文件 文件夹下面有文件
只有分桶表不可以load,其他的都可以
内部分区表 外部分区表 分区表需要load到对应的分区文件夹下面 然后 msck repair
内部表 外部表 都是可以load
分区表的分区条件在建表的时候是不是不能出现在见表语句的,字段定义中 ?对对对的
create table myuser (id int ,name age,month string ) partitioned by (month string) 报错
导入和’导出时,可以对字段进行操作吗 可以的
insert overwrite directory '/kkb/hivedatas/stu' row format delimited fields terminated by ','
select id from stu;
3.1、直接向表中插入数据(强烈不推荐使用)
hive (myhive)> create table score3 like score;
hive (myhive)> insert into table score3 partition(month ='201807') values ('001','002','100');
3.2、通过load方式加载数据(必须掌握)
语法:
hive> load data [local] inpath 'dataPath' overwrite | into table student [partition (partcol1=val1,…)];
通过load方式加载数据
hive (myhive)> load data local inpath '/kkb/install/hivedatas/score.csv' overwrite into table score3 partition(month='201806');
3.3、通过查询方式加载数据(必须掌握)
通过查询方式加载数据
hive (myhive)> create table score5 like