Hadoop生态圈(六):Hive(二)

目录

5 DML操作

5.1 数据导入

5.1.1 向表中加载数据(load)

5.1.2 通过查询语句向表中插入数据(Insert)

5.1.3  查询语句中创建表并加载数据(As Select)

5.1.4 创建表时通过location指定加载数据路径

5.1.5 Import数据到指定Hive表中

5.2 数据导出

5.2.1 Insert导出

5.2.2 Hadoop与hive Shell导出到本地对比

5.2.3 Export 导出到HDFS上

5.3 清除表中数据

6 DQL查询

其他常用的查询函数

7  函数

7.1 系统内置函数

7.2 自定以函数

7.3 自定义UDF函数


5 DML操作

5.1 数据导入

5.1.1 向表中加载数据(load)

1. 语法: 

hive> load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student

(1)load data:表示加载数据

(2)local:表示从本地加载数据到hive表(复制);否则从HDFS加载数据到hive表(移动)

(3)inpath:表示加载数据的路径

(4)overwrite into:表示覆盖表中已有数据,否则表示追加

(5)into table:表示加载到哪张表

(6)student:表示具体的表

2.  案例

(1)创建一张表

hive (default)> create table student(id string, name string) row format delimited fields terminated by '\t';

(2)加载本地文件到hive

hive (default)> load data local inpath  '/opt/module/datas/student.txt'  into table default.student;

(3)加载HDFS文件到hive中

上传文件到HDFS

hive (default)> dfs -put /opt/module/datas/student.txt /user/hadoop/hive;

加载HDFS上数据(从hdfs上加载数据为移动而不是复制)

hive (default)> load data inpath '/user/root/hive/student.txt' into table default.student;

(4)加载数据覆盖表中已有的数据

上传文件到HDFS

hive (default)> dfs -put /opt/module/datas/student.txt /user/hadoop/hive;

加载数据覆盖表中已有的数据

hive (default)> load data inpath '/user/hadoop/hive/student.txt' overwrite into table default.student;

5.1.2 通过查询语句向表中插入数据(Insert)

1.创建一张表

hive (default)> create table student(id int, name string) row format delimited fields terminated by '\t';

2.基本插入数据

hive (default)> insert into table  student values(1,'wangwang');

快速复制表数据(快速备份)

insert  into  table  student  select  *  from  student1;

Hadoop生态圈(六):Hive(二)_第1张图片

5.1.3  查询语句中创建表并加载数据(As Select)

根据查询到的结果创建表(查询到的结果会添加到新创建的表中)

create table if not exists student3  as select id, name from student;

5.1.4 创建表时通过location指定加载数据路径

1. 创建表,并指定在hdfs上的位置(如果当前路径没有数据,表为空,等到该路径有数据时再加载)

hive (default)> create table if not exists student4( id int, name string )

                    row format delimited fields terminated by '\t'   location  '/user/hive/warehouse/student4';

5.1.5 Import数据到指定Hive表中

hive (default)> import table student8 from   '/user/hive/warehouse/export/student';

5.2 数据导出

5.2.1 Insert导出

1. 将查询结果导出到本地

hive (default)>insert overwrite  local  directory  '/opt/module/datas/export/student'  select  *  from student;

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

hive (default)>insert  overwrite  local  directory  '/opt/module/datas/export/student1'  row format delimited  fields terminated  by  '\t'  

                       select  * from student;

3.  将查询到的结果导出到HDFS上(把local去掉即可)

hive (default)>insert  overwrite   directory  '/opt/module/datas/export/student1'  row format delimited  fields terminated  by  '\t'  

                       select  * from student;

5.2.2 Hadoop与hive Shell导出到本地对比

1. hadoop

hive (default)> dfs -get   /user/hive/warehouse/student/student.txt   /opt/module/datas/export/student3.txt;

2. hive Shell

[hadoop@hadoop101 hive]$ bin/hive -e 'select * from default.student;'   >   /opt/module/datas/export/student4.txt;

5.2.3 Export 导出到HDFS上

hive (default)>export  table  default.student  to    '/user/hive/warehouse/export/student';

5.3 清除表中数据

hive (default)> truncate table student;

6 DQL查询

查询基本语法(与数据库查询基本一致)

SELECT [ALL | DISTINCT] select_expr, select_expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list]

[ORDER BY col_list]

[SORT BY col_list]

[LIMIT number]

HQL和SQL语法基本上一致,这也是Hive的一个很大优势,很容易使熟悉sql的人员上手,下面就值介绍一些Hive的不同之处:

1. Like和RLike

    RLike是Hive中的一个扩展,其可以通过Java的正则表达式这个更强大的语言来直指定匹配条件

    比如:Rlike查询员工薪水中包含2的员工信息

hive (default)> select  *  from emp where  sal RLIKE  '[2]';

2. HQL底层是将查询语句翻译为MapReduce程序

sory  by:是对MapReduce内部进行排序,对全局结果集来说不是排序(也就是说分区内有序,全局不一定有序)

既然HQL最后是MapReduce程序,那么我们就可以设置reduce的个数

设置reduce个数:

hive (default)> set mapreduce.job.reduces=3;

查看reduce的个数

hive (default)> set mapreduce.job.reduces;

其他常用的查询函数

1. 空字段赋值

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

例如:oracle数据库推广使用过的一个例子,计算每个员工的年薪(12*sla + comm)

select ename,(sal*12 + nvl(comm,0)) yearSal from emp;

例二:如果员工的comm为null,则用领导id代替

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

2. case  when

1. 准备数据

name

dept_id

sex

八戒

A

猴哥

A

松松

B

凤姐

A

小可爱

B

萌萌

B

2.需求

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

A     2       1

B     1       2

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

[bigdata@hadoop102 datas]$ vim 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;

3. 行转列

1. 相关函数说明

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数为剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

2. 数据

name

Constellation

blood_type

八戒

白羊座

A

猴哥

射手座

A

松松

白羊座

B

猪八戒

白羊座

A

凤姐

射手座

A

3. 需求: 把星座和血型一样的人归类到一起。结果如下:

射手座,A            猴哥|凤姐

白羊座,A            八戒|猪八戒

白羊座,B            松松

4.创建本地person.txt,导入数据

[bigdata@hadoop102 datas]$ vim person.txt

八戒    白羊座  A

猴哥    射手座  A

松松    白羊座  B

猪八戒  白羊座  A

凤姐    射手座  A

5.创建hive表并导入数据

create table person_info(name string, xingzuo string, blood_type string)

row format delimited fields terminated by "\t";

 

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

分析:

Hadoop生态圈(六):Hive(二)_第2张图片

 6.  实现

select

    t1.base,

    concat_ws('|', collect_set(t1.name)) name

from

    (select

        name,

        concat(xingzuo,  ','  , blood_type) base

    from

        person_info) t1

group by

    t1.base;

     Hadoop生态圈(六):Hive(二)_第3张图片

4. 列转行

1. 函数说明

    EXPLODE(col):将hive一中复杂的array或者map结构拆分成多行。

    LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2. 数据准备

Movie

category

《福尔摩斯》

悬疑,动作,科幻,剧情

《无间道》

悬疑,警匪,动作,心理,剧情

《红海行动》

战争,动作,灾难

3. 需求:将电影分类中的数组展开。结果如下:

《福尔摩斯》      悬疑

《福尔摩斯》      动作

《福尔摩斯》      科幻

《福尔摩斯》      剧情

《无间道》   悬疑

《无间道》   警匪

《无间道》   动作

《无间道》   心理

《无间道》   剧情

《红海行动》        战争

《红海行动》        动作

《红海行动》        灾难

4. 创建本地movie.txt,导入数据

[bigdata@hadoop102 datas]$ vi movie.txt

《福尔摩斯》 悬疑,动作,科幻,剧情

《无间道》 悬疑,警匪,动作,心理,剧情

《红海行动》 战争,动作,灾难

5.创建hive表并导入数据

create table movie_info( movie string,  category array)

row format delimited fields terminated by "\t"

collection items terminated by ",";   //第二个字段以,分割

 

load data local inpath "/opt/module/datas/movie.txt" into table movie_info;

6.按需求查询数据

select  movie,    category_name

from    movie_info lateral view explode(category) table_tmp as category_name;

7  函数

7.1 系统内置函数

1.查看系统自带的函数

hive> show functions;

2.显示自带的函数的用法

hive> desc function upper;

3.详细显示自带的函数的用法

hive> desc function extended upper;

7.2 自定以函数

1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。

2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

3)根据用户自定义函数类别分为以下三种:

(1)UDF(User-Defined-Function) 一进一出

(2)UDAF(User-Defined Aggregation Function)聚集函数,多进一出   类似于:count/max/min

(3)UDTF(User-Defined Table-Generating Functions)一进多出   如lateral view explore()

4)官方文档地址:https://cwiki.apache.org/confluence/display/Hive/HivePlugins

5)编程步骤:

(1)继承org.apache.hadoop.hive.ql.UDF

(2)需要实现evaluate函数;evaluate函数支持重载;

(3)在hive的命令行窗口创建函数

        a)添加jar

add jar linux_jar_path

        b)创建function,

create [temporary] function [dbname.]function_name AS class_name;

(4)在hive的命令行窗口删除函数

drop [temporary] function [if exists] [dbname.]function_name;

6)注意事项

(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

7.3 自定义UDF函数

org.apache.hive

hive-exec

1.2.1

3.创建一个类

package com.bigdata.hive;
import org.apache.hadoop.hive.ql.exec.UDF;

public class Lower extends UDF {   
    public String evaluate (final String s) {
        if (s == null) {
        return null;
        }
    return s.toLowerCase();
    }
}

4.打成jar包上传到服务器/opt/module/jars/udf.jar

5.将jar包添加到hive的classpath

hive (default)> add jar /opt/module/jars/udf.jar;

6.创建临时函数与开发好的java class关联

hive (default)> create temporary function mylower as "com.bigdata.hive.Lower";

7.即可在hql中使用自定义的函数strip 

hive (default)> select ename, mylower(ename) lowername from emp;

你可能感兴趣的:(Hadoop)