大数据开发之Hive篇----DML以及分区表构建

上篇我们介绍了DDL中的两种操作,今天我们来继续了解DML的一些操作

DML(Database Manipulation Language):

导入数据基本版:load data [local] inpath 'filepath' [overwrite] into table tab_name这个是导入数据的基本版,其中当添加上关键字local时是从本地文件路径中导入数据的,如果没有加上上local这个关键字就是将hdfs上面的数据移动到表所对应的指定目录上去了,原地址将不再保存数据了。

case when then == if-else

这个语法和if-else是差不多的,当满足when的条件的时候就执行then这个语法后面的命令。

select name,age,case when age > 24 then 'man' when age <= 24 then 'women' else 'shenmegui' end from doudou_1;

这个语法就是在select 和 from 中间添加了case when then语句,一般then后面可以添加一个新的临时字段或者在现有的字段上面执行操作。

union all

就是将两个数据表临时地合并成一个表展示出来,一般用在数据倾斜的场景。

Hive上的functions

查看函数的操作:show functions;这个操作就是将所有的函数全部都展示出来,但也展示名字而已。而如果要查看一个具体的函数的功能:desc function extended func_name; 具体的例子就自己实现一下看下吧

当一个文本文件里面有数组作为一个字段的时候,我们要怎么进行切分呢?在导入数据的基本版后面添加上collection items terminated by xxx;

这样我们学科字段里面就是数组类型了。

假设,现在我们有一个需求,就是表格当中就是一个字段,这个字段是一个数组,里面记录了一些句子,我们要求对整个表格里面的所以句子的单词进行一次词频统计(面试常考题,使用hive和spark进行词频统计)

现在我们先来创建一个这样的一个表和数据

select word,count(1) from (select explode(split(sentence,' ')) as word from doudou_wc) as l group by word;

其中,我们对单词进行了分组然后统计数量,而在这之前我们先对sentence句子进行切分然后explode成一个临时表。

分区表

假设,我们现在有一个emp数据文件在hdfs上面,我们先为其构建一个表结构以方便我们后面来构建分区表。

有了这个表结构后,我们就可以依据这个表结构为这个数据构建一个分区表,那什么是分区表呢?一个表按照某个字段(可以多个字段)进行分区,使用了分区会一定程度上提高了查询效率,其实就有点像使用了哈希桶(但是桶的数量是f确定的,而分区的数量是根据分区字段里内容的种类来确定的,当有新的值时就创建一个新分区)。

这是构建分区表的格式:create table tab_name(col_name data_type) partitioned by (field_name data_type.....) row format ...;

也就是指定了一个分区字段。

这里我手动完成了一个分区的数据导入,这个时候分区目录就只有partition_date=2018-10这个分区了,我们来查看下hdfs上面是什么情况。

在表目录下还有一个分区目录,而在分区目录里面才是我们的数据文件

还有一种方法是根据我们已存在的表重新构建分区表,我们就用我们之前构建的表doudou_emp,同时我们使用deptno这个字段来作为分区字段。

create table doudou_emp_static_partition (empno int,ename string,job string,mgr int,hiredate string,sal double,comm double) partitioned by (deptno int) row format delimited fields terminated by '\t';  定义清楚表的字段以及分区字段的名称。

然后,我们就是用已经存在的表来构建一个分区表。

insert into table doudou_emp_static_partition partition(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from doudou_emp where deptno=10;

这个时候我们就将deptno=10的数据导入到了分区表里面了,我们去看下hdfs里面是怎样的。

现在我们会发现一个问题,就是如果我们的分区字段是有很多个值,或者我们有多个分区字段,那么分区目录就有很多个了,我们用上面的方法不就导数据不就导死了。

上面我们的方法其实是一种静态分区的构建方法,下面我们介绍动态分区的方法

要使用动态分区的方法时要设置这样一个参数:

set hive.exec.dynamic.partition.mode=nonstrict

insert (overwrite|into) table doudou_emp_dynamic_partition partition(deptno) select empno,ename,job,mgr,hiredate,sal,comm,deptno from doudou_emp;

看到这里,我们对比下两个方法的不同,使用静态方法时需要在partition(col_name=col_value)指定具体的值,同时在后面的select中不能再出现这个分区字段了。但是,动态分区就不用了partition(col_name)里面不需要指定具体的值,而select后面的字段中要出现分区字段。

总结一下,在构建分区表的时候要么创建完表格后,手动将数据导入导具体的表格中,需要增加新的分区时再使用命令:alter table tab_name add partition(col_name=col_value),然后再手动导入数据。另外一种是从一个已在的数据表中再构建数据分区表。

而导入数据也可以分成静态分区和动态分区的方法,但是想动态导入数据需要提前构建好数据的表结构。

今天的博文可能结构上不是很好,我将慢慢修改的,也请各位大神能为我斧正一些错误之处。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值