A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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上面,我们先为其构建一个表结构以方便我们后面来构建分区表。



有了这个表结构后,我们就可以依据这个表结构为这个数据构建一个分区表,那什么是分区表呢?一个表按照某个字段(可以多个字段)进行分区,使用了分区会一定程度上提高了查询效率,其实就有点像使用了哈希桶。

这是构建分区表的格式: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里面是怎样的。

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

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

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),然后再手动导入数据。另外一种是从一个已在的数据表中再构建数据分区表。

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



1 个回复

正序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马