网站宣传制作,怎么进入wordpress的后台,科技让生活更美好作文450字,软件下载网站排行一、Hive分区
1.引入#xff1a; 在大数据中#xff0c;最常见的一种思想就是分治#xff0c;我们可以把大的文件切割划分成一个个的小的文件#xff0c;这样每次操作一个个小的文件就会很容易了#xff0c;同样的道理#xff0c;在hive当中也是支持这种思想的#xff…一、Hive分区
1.引入 在大数据中最常见的一种思想就是分治我们可以把大的文件切割划分成一个个的小的文件这样每次操作一个个小的文件就会很容易了同样的道理在hive当中也是支持这种思想的就是我们可以把大的数据按照每天或者每小时切分成一个个小的文件这样去操作小的文件就会容易很多了。
2.优点
避免全局搜索减少数据扫描工作量提高了查询效率。 3.静态分区SP
借助于物理的文件夹分区实现快速检索的目的
一般对于查询比较频繁的列设置为分区列
需要手动插入或加载数据进行分区 创建单分区表语法 CREATE TABLE IF NOT EXISTS t_student ( sno int, sname string ) partitioned by(grade int) row format delimited fields terminated by ,; -- 分区的字段不要和表的字段相同。相同会报错error10035 1,xiaohu01,1 2,xiaohu02,1 3,xiaohu03,1 4,xiaohu04,1 5,xiaohu05,1 6,xiaohu06,2 7,xiaohu07,2 8,xiaohu08,2 9,xiaohu09,3 10,xiaohu10,3 11,xiaohu11,3 12,xiaohu12,3 13,xiaohu13,3 14,xiaohu14,3 15,xiaohu15,3 16,xiaohu16,4 17,xiaohu17,4 18,xiaohu18,4 19,xiaohu19,4 20,xiaohu20,4 21,xiaohu21,4 -- 载入数据 -- 将相应年级依次导入 load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade1.txt into table t_student partition(grade1); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade2.txt into table t_student partition(grade2); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade3.txt into table t_student partition(grade3); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade4.txt into table t_student partition(grade4); 图示 静态多分区表语法 CREATE TABLE IF NOT EXISTS t_teacher ( tno int, tname string ) partitioned by(grade int,clazz int) row format delimited fields terminated by ,; --注意前后两个分区的关系为父子关系也就是grade文件夹下面有多个clazz子文件夹。 1,xiaoge01,1,1 2,xiaoge02,1,1 3,xiaoge03,1,2 4,xiaoge04,1,2 5,xiaoge05,1,3 6,xiaoge06,1,3 7,xiaoge07,2,1 8,xiaoge08,2,1 9,xiaoge09,2,2 --载入数据 load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade11.txt into table t_teacher partition(grade1,clazz1); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade12.txt into table t_teacher partition(grade1,clazz2); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade13.txt into table t_teacher partition(grade1,clazz3); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade21.txt into table t_teacher partition(grade2,clazz1); load data local inpath /usr/local/soft/bigdata29/wendang/gread_data/grade22.txt into table t_teacher partition(grade2,clazz2); 4.动态分区DP 静态分区与动态分区的主要区别在于静态分区是手动指定而动态分区是通过数据来进行判断。 详细来说静态分区的列是在编译时期通过用户传递来决定的动态分区只有在SQL执行时才能决定。
开启动态分区首先要在hive会话中设置如下的参数 # 表示开启动态分区 hive set hive.exec.dynamic.partitiontrue; # 表示动态分区模式strict需要配合静态分区一起使用、nostrict hive set hive.exec.dynamic.partition.modenonstrict; 以下是可选参数 # 表示支持的最大的分区数量为1000可以根据需求自己调整 hive set hive.exec.max.dynamic.partitions.pernode1000; # 设置为true表示开启动态分区的功能默认为false --hive.exec.dynamic.partitiontrue; # 设置为nonstrict表示允许所有分区都是动态的默认为strict -- hive.exec.dynamic.partition.modenonstrict; -- hive.exec.dynamic.partition.modestrict; # 每个mapper或reducer可以创建的最大动态分区个数(默认为100) 比如源数据中包含了一年的数据即day字段有365个值那么该参数就需要设置成大于365如果使用默认值100则会报错 --hive.exec.max.dynamic.partition.pernode100; # 一个动态分区创建可以创建的最大动态分区个数默认值1000 --hive.exec.max.dynamic.partitions1000; # 全局可以创建的最大文件个数默认值100000 --hive.exec.max.created.files100000; # 当有空分区产生时是否抛出异常默认false -- hive.error.on.empty.partitionfalse; 动态分区案例 动态插入学生年级班级信息 --创建分区表 CREATE TABLE IF NOT EXISTS t_student_d ( sno int, sname string ) partitioned by (grade int,clazz int) row format delimited fields terminated by ,; --创建原始数据表(外部) CREATE EXTERNAL TABLE IF NOT EXISTS t_student_e ( sno int, sname string, grade int, clazz int ) row format delimited fields terminated by ,; 原始表数据 1,xiaohu01,1,1 2,xiaohu02,1,1 3,xiaohu03,1,1 4,xiaohu04,1,2 5,xiaohu05,1,2 6,xiaohu06,2,3 7,xiaohu07,2,3 8,xiaohu08,2,3 9,xiaohu09,3,3 10,xiaohu10,3,3 11,xiaohu11,3,3 12,xiaohu12,3,4 13,xiaohu13,3,4 14,xiaohu14,3,4 15,xiaohu15,3,4 16,xiaohu16,4,4 17,xiaohu17,4,4 18,xiaohu18,4,5 19,xiaohu19,4,5 20,xiaohu20,4,5 21,xiaohu21,4,5 将原始数据表的查询结果作为分区结果加载到分区表中
insert overwrite table t_student_d partition (grade,clazz) select * from t_student_e; 5.分区表操作
举例
1全表扫描不推荐效率低
select count(*) from st_student_d
2使用where条件进行分区裁剪避免了全表扫描效率高
select count(*) from st_student_d where grade 1;
3也可以在where条件中使用非等值判断
select count(*) from t_student_d where grade3 and grade1;
4查看分区
show partitions t_student_d
5添加分区
alter table t_student_d add partition (grade6);
6删除分区
alter table t_student_d drop partition (grade5);
2.1 业务场景 数据分桶的适用场景 二、Hive分桶
1.概述与使用场景
概述在Hive中分桶是一种用于提高查询性能的技术通过将数据集分成更小的、可管理的部分来实现。分桶是通过对表的某一列进行哈希来实现的Hive会根据分桶列的值来确定数据应该放入哪个桶。
使用场景当我们的分区之后最后的文件还是很大怎么办就引入了分桶的概念。将这个比较大的文件再分成若干个小文件进行存储我们再去查询的时候在这个小范围的文件中查询就会快很多。对于hive中的每一张表、分区都可以进一步的进行分桶。当然分桶不是说将文件随机进行切分存储而是有规律的进行存储。 2.数据分桶原理
Hive采用对列值哈希然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中 bucket num hash_function(bucketing_column) mod num_buckets 列的值做哈希取余 决定数据应该存储到哪个桶 3.数据分桶优势 方便抽样 使取样sampling更高效。在处理大规模数据集时在开发和修改查询的阶段如果能在数据集的一小部分数据上试运行查询会带来很多方便 提高join查询效率 获得更高的查询处理效率。桶为表加上了额外的结构Hive 在处理有些查询时能利用这个结构。具体而言连接两个在包含连接列的相同列上划分了桶的表可以使用 Map 端连接 Map-side join高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以可以大大较少JOIN的数据量。 4.分桶案例
1首先我们需要开启分桶的支持 set hive.enforce.bucketingtrue; 2创建一个普通的表 create table person ( id int, name string, age int ) row format delimited fields terminated by ,; 3数据准备id,name,age 1,tom,11 2,cat,22 3,dog,33 4,hive,44 5,hbase,55 6,mr,66 7,alice,77 8,scala,88 将数据load到person表中 load data local inpath 文件在Linux上的绝对路径 into table psn31; 4创建分桶表 create table psn_bucket ( id int, name string, age int )clustered by(age) into 4 buckets row format delimited fields terminated by ,; 5将查询的数据insert到表psn_bucket中 insert into psn_bucket select * from person; 5.分桶和分区的区别
分区和分桶的区别在于其提供的性能优化方向不同。分区适用于数据快速访问特定的数据范围而分桶适用于对于数据JOIN操作的效率提升。
分区之后会产生分区文件夹数据会存储在问价夹下的文件中分桶不会产生文件夹数据直接存储在分桶之后的文件中。简而言之分区是对数据进行划分而分桶是对文件进行划分。 三、Java连接hive(Hive JDBC)
1.启动hiveserver2 hiveserver2
2.新建maven项目并添加两个依赖 dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-common/artifactId version2.7.6/version /dependency !-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -- dependency groupIdorg.apache.hive/groupId artifactIdhive-jdbc/artifactId version1.2.1/version /dependency 3.编写JDBC代码
import java.sql.*;public class HiveJDBC {public static void main(String[] args) throws ClassNotFoundException, SQLException {Class.forName(org.apache.hive.jdbc.HiveDriver);Connection conn DriverManager.getConnection(jdbc:hive2://master:10000/bigdata29);Statement stat conn.createStatement();ResultSet rs stat.executeQuery(select * from students limit 10);while (rs.next()) {int id rs.getInt(1);String name rs.getString(2);int age rs.getInt(3);String gender rs.getString(4);String clazz rs.getString(5);System.out.println(id , name , age , gender , clazz);}rs.close();stat.close();conn.close();}
} 四、Hive排序
1.全局排序order by order by 会对输入做全局排序因此只有一个reducer会导致当输入规模较大时需要较长的计算时间 使用 order by子句排序 :ASCascend升序默认| DESCdescend降序 order by放在select语句的结尾 语法select * from 表名 order by 字段名1[别名2...]; 2.局部排序(对reduce内部做排序) sort by 不是全局排序,其在数据进入reducer前完成排序。 如果用sort by进行排序并且设置mapred.reduce.tasks大于1,则sort by 只保证每个reducer的输出有序不保证全局有序。asc,desc都可以。 步骤 1设置reduce个数 set mapreduce.job.reduce自定义数量; 2查看reduce个数 set mapreduce.job.reduces; 3排序 select * from 表名 sort by 字段名[,字段名...]; 3.分区排序(本身没有排序) distribute by字段根据指定的字段将数据分到不同的reducer且分发算法是hash散列。 类似MR中partition,进行分区结合sort by使用。注意distribute by 要在sort by之前 对于distrbute by 进行测试一定要多分配reduce进行处理否则无法看到distribute by的效果。
步骤 1设置reduce个数 set mapreduce.job.reduce自定义数量; 2排序 select * from 表名 distribute by 字段名[,字段名...] sort by 字段; 4.分区并排序 cluster by字段除了具有Distribute by的功能外还会对该字段进行排序 asc desc cluster by distribute by sort by 只能默认升序不能使用倒序
语法 select * from 表名 distribute by 字段名[,字段名...] sort by 字段名[,字段名...]; 四种排序图解