尚硅谷大数据技术之Hive(新)第6章 查询

6.6.2 分桶抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。

查询表stu_buck中的数据。

hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);

注:tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y) 。

y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了4份,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据。

x表示从哪个bucket开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。例如,table总bucket数为4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2个bucket的数据,抽取第1(x)个和第3(x+y)个bucket的数据。

注意:x的值必须小于等于y的值,否则

FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

6.7 其他常用查询函数

6.7.1 空字段赋值

  1. 函数说明

NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。

  1. 数据准备:采用员工表
  2. 查询:如果员工的comm为NULL,则用-1代替

hive (default)> select nvl(comm,-1) from emp;

OK

_c0

20.0

300.0

500.0

-1.0

1400.0

-1.0

-1.0

-1.0

-1.0

0.0

-1.0

-1.0

-1.0

-1.0

  1. 查询:如果员工的comm为NULL,则用领导id代替

hive (default)> select nvl(comm,mgr) from emp;

OK

_c0

20.0

300.0

500.0

7839.0

1400.0

7839.0

7839.0

7566.0

NULL

0.0

7788.0

7698.0

7566.0

6.7.2 CASE WHEN

  1. 1. 数据准备

name

dept_id

sex

悟空

A

大海

A

宋宋

B

 

 

凤姐

A

婷姐

B

婷婷

B

2.需求

求出不同部门男女各多少人。结果如下:

A     2       1

B     1       2

3.创建本地emp_sex.txt,导入数据

[atguigu@hadoop102 datas]$ vi emp_sex.txt

悟空 A 男

大海 A 男

宋宋 B 男

凤姐 A 女

婷姐 B 女

婷婷 B 女

4.创建hive表并导入数据

create table emp_sex(

name string,

dept_id string,

sex string)

row format delimited fields terminated by "\t";

load data local inpath '/opt/module/datas/emp_sex.txt' into table emp_sex;

5.按需求查询数据

select

  dept_id,

  sum(case sex when '男' then 1 else 0 end) male_count,

  sum(case sex when '女' then 1 else 0 end) female_count

from

  emp_sex

group by

  dept_id;