Hive的分桶表

1 分桶表原理

分桶是相对分区进行更细粒度的划分;Hive表或分区表可进一步的分桶;

分桶将整个数据内容按照某列取hash值,对桶的个数取模的方式决定该条记录存放在哪个桶当中;具有相同hash值的数据进入到同一个文件中;

比如按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。

  • 取模结果为==0==的数据记录存放到一个文件

  • 取模结果为==1==的数据记录存放到一个文件

  • 取模结果为==2==的数据记录存放到一个文件

2 分桶的作用

  • 1、取样sampling更高效。没有分区的话需要扫描整个数据集。

  • 2、提升某些查询操作效率,例如map side join

2.1在创建分桶表之前要执行的命令:

  • set hive.enforce.bucketing=true;开启对分桶表的支持

  • set mapreduce.job.reduces=4; 设置与桶相同的reduce个数(默认只有一个reduce)

2.2进入hive客户端然后执行以下命令:

-- 创建分桶表:
create table myhive.user_buckets_demo(id int, name string)
clustered by(id) 
into 4 buckets 
row format delimited fields terminated by '\t';
--加载数据到桶表user_buckets_demo中:

insert into table user_buckets_demo select * from user_demo;

2.3hdfs上查看表的数据目录

2.4抽样查询桶表的数据:

tablesample抽样语句语法:tablesample(bucket x out of y)

  • x表示从第几个桶开始取数据;
  • y与进行采样的桶数的个数、每个采样桶的采样比例有关;
  • 如:

select * from user_buckets_demo tablesample(bucket 1 out of 2);

  • 需要采样的总桶数=4/2=2个
  • 先从第1个桶中取出数据
  • 1+2=3,再从第3个桶中取出数据。

3 Hive数据导入(3种)

3.1直接向表中插入数据(强烈不推荐使用)

insert into table score3 partition(month ='201807') values ('001','002','100');

3.2通过load加载数据

load data [local] inpath 'dataPath' overwrite | into table student [partition (partcol1=val1,…)];

如:load data local inpath '/install/hivedatas/score.csv' overwrite into table score3 partition(month='201806');

3.3通过查询加载数据

insert overwrite table score5 partition(month = '201806') select s_id,c_id,s_score from score;

4 Hive数据导出

4.1insert 导出

将查询的结果导出到本地:

insert overwrite local directory '/install/hivedatas/stu' select * from stu;

4.2将查询的结果格式化导出到本地

insert overwrite local directory '/install/hivedatas/stu2' row format delimited fields terminated by ',' select * from stu;

4.3将查询的结果导出到HDFS上

insert overwrite directory '/hivedatas/stu' row format delimited fields terminated by  ','  select * from stu;

4.4export导出到HDFS上

export table  myhive.stu to '/install/hivedatas/stuexport';

发布了31 篇原创文章 · 获赞 20 · 访问量 3079

猜你喜欢

转载自blog.csdn.net/fengge18306/article/details/105191108
今日推荐