Hive常用函数和分桶表
一、字符串常用函数
二、分桶表
分桶操作是更细粒度的分配方式,一张表可以同时分区和分桶,分桶的原理是根据指定的列的计算hash值模余分桶数量后将数据分开存放。
Hive的分桶实际上就是Hadoop的分区,有几个桶,就用几个reduce任务来处理。
需要注意的是:分桶表必须是内部表。因为只有在创建表的时候才能指定桶的数量,然后在往表里插入数据的时候,会按照指定的分区字段(列字段)做分桶。
实现步骤:
1.创建带桶的 table :
create table teacher(class string) clustered by (class) into 3 buckets row format delimited fields terminated by ‘\t’;
2.开启分桶机制:
set hive.enforce.bucketing=true;
3.往表中插入数据:
insert overwrite table teacher select * from b1;//需要提前准备好temp,从temp查询数据写入到teacher。
注:teacher是一个分桶表,对于分通表,不允许以外部文件方式导入数据,只能从另外一张表数据导入。
4.查看表的结构,会发现当前表下有三个文件:
dfs -ls /user/hive/warehouse/teacher;
5.读取数据,看一个文件的数据:
dfs -cat /user/hive/warehouse/teacher/000000_0;
注:桶使用 hash 来实现,所以每个文件拥有的数据的个数都有可能不相等。
6.对桶中的数据进行采样:
select * from teacher tablesample(bucket 1 out of 3 on class);
注:分桶语法—TABLESAMPLE(BUCKET x OUT OF y)
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。
x表示从哪个bucket开始抽取。
例如:table总bucket数为3,tablesample(bucket 3 out of 3),表示总共抽取(3/3=)1个bucket的数据,抽取第3个bucket的数据。
再例如:table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据。
7.查询第一个桶里数据,并返回一半的数据:
select * from bucketed_user tablesample(bucket 1 out of 6 on id);