分桶表和分区表的区别
分桶表
建表语法
clustered by 聚类依据
示例
创建分桶表
加载数据到分桶表(错误)
load data local inpath '/home/sjh/ft.txt' into table sjh.ft;
报错: 提示设置 >>set hive.strict.checks.bucketing=false 作用是关闭 Hive 中的一个严格检查机制
默认情况下,Hive 会对分桶表的加载操作进行严格的检查,以确保数据正确地分布到各个桶中。这种严格的检查可以防止数据加载过程中的错误,但也可能导致一些不必要的限制,特别是在用户确定自己的操作是正确的情况下。
通过执行 set hive.strict.checks.bucketing=false 命令,用户可以关闭这种严格的检查。这意味着 Hive 将不再强制执行分桶相关的安全检查,用户可以直接将数据加载到分桶表中,而不需要通过中间表和 insert ... select 语句来进行。
注意: set 修改只作用于本次会话
如果想永久修改>>找到hive的安装目录,修改配置文件
查看加载情况
load的本质是把文件复制再上传>>没有经过map reduce>>数据没有进行拆分>>解决: 使用insert into , 写20个insert 非常不方便>> 创建一个表, 把数据放到表里, 再用insert into
删除
示例
把数据加载到源表
-- 通过insert方法,执行mr
insert into sjh.ft select * from sjh.ftt;
执行日志: 先走map>>再到reduce
ftt 通过load加载数据,只有一个文件
ft通过 insert into 插入数据, 有4个文件, 和分桶个数对应
查看桶里面的数据>>分桶依据: id/桶数 >>余数为0进0号桶; 余数为1进1号桶;余数为2进2号桶...
注意: 抽样查询时>>000000_0是1号桶, 000001_0是2号桶, 以此类推
分桶的好处
假设没有分桶, A表和B表连接>>A的每个id分别和B表的每个id 连接一次
交互次数= A表的id个数 * B表的id个数 = 10*10=100
如果把A表B表做成分桶表,按照id分成2个桶, 那么A表和B表分别产生了0号桶和1号桶, 现在A表和B表连接只需要交互50次,即0号桶和0号桶交互(25), 1号桶和1号桶交互
分桶的作用>>提高表连接效率
查看分桶文件
分区分桶表
-
sale_date
是分区列,数据将按照sale_date
的值进行分区存储。 -
product_id
是分桶列,数据在每个分区内按照product_id
进行分桶,分为4个桶。
抽样查询
从大数据集中随机抽取部分数据进行分析的技术。抽样查询可以帮助用户在不需要处理整个数据集的情况下,快速获取数据的代表性样本,从而进行初步分析、测试或验证。
1.基于分桶表的抽样查询
分桶表是将数据按照某个字段的哈希值分成若干个桶(Bucket),抽样时可以直接从指定的桶中抽取数据。
语法:


示例
从1号桶开始抽, 抽取4/2=2个桶的数量
第二个桶是 X+Y=1+2=3 ,3号桶
示例
从第8个桶开始抽, 即余数为3的那个桶>>4号桶
抽取的桶的数量=4/16=1/4, 一个桶的数据总量是5, 5*1/4约为1
2.基于数据块的抽样
直接从数据文件中随机抽取一定比例的数据块
3.基于行的抽样
随机抽取表中的一定数量的行
4.基于随机函数的抽样
5.基于分区的抽样
如果表是分区表,可以从指定的分区中抽取数据
示例