Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数

目录

开启hive中分区表支持中文字段:

分区表操作

建表

分区表插入数据:

覆盖原先分区中的数据:

查询分区:

 删除分区:

恢复分区:

强制删除分区(慎用):

添加分区:

增加动态分区操作

异常情况:

创建多级分区:

多级分区的特点:

数据加载

load

1、通过HDFS上的数据加载数据至表中

2、 通过本地文件系统上传数据至表中

HDFS 

INSERT

AS SELECT

LOCATION

IMPORT

数据导出(慎用)

INSERT

 HDFS get 方法

hive -e

 export方法 

数据类型

基本数据类型:

日期类型:

复杂数据类型

ARRAY使用

MAP使用

Struct使用

数据类型转换

简单数据查询语言DML

where

JOIN

GROUP BY

排序

ORDER BY

 SORT BY

distribute by

 cluster by

distinct 

函数的基本使用

查看函数

IF函数

 CASE WHEN 函数

日期函数

字符串函数

字符串截取函数

切分函数


开启hive中分区表支持中文字段:

首先登录到mysql中:

mysql -uroot -p123456

进入hive表:

use hive;

修改hive database编码

alter database hive default character set utf8;

修改table编码

alter table PARTITIONS default character set utf8;

alter table PARTITION_KEY_VALS default character set utf8;

alter table SDS default character set utf8;

修改字段编码:

alter table PARTITIONS modify column PART_name varchar(190) character set utf8;

alter table PARTITION_KEY_VALS modify column PART_KEY_VAL varchar(256) character set utf8;

alter table SDS modify column LOCATION varchar(4000) character set utf8;

分区表操作

分区表与其他表的不同点:分区字段的值在hdfs中以表目录下的子目录形式保存下来的

格式为:分区字段=值

建表

建表语句:

CREATE TABLE IF NOT EXISTS learn2.partition_student(
id STRING COMMENT "学生ID",
name STRING COMMENT "学生姓名",
age int COMMENT "年龄",
gender STRING COMMENT "性别"
) PARTITIONED BY (clazz STRING COMMENT "班级") 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;

由于加载的数据中是以逗号切分的,所以这里使用逗号作为分隔字符创建该表,分隔字符的确认在于所要向表中插入数据的内容决定。

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第1张图片

分区表插入数据:

 对分区表插入数据时,需要指明所插入的数据中的分区字段:

格式:load data local inpath "本地路径" into table 表名 PARTITION(分区字段 = 值)

load data local inpath "/usr/local/soft/hive-3.1.2/data/文科一班.txt" into table learn2.partition_student PARTITION(clazz="文科一班");
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科二班.txt" into table learn2.partition_student PARTITION(clazz="文科二班");

查询表中内容的结果:

在hdfs中查看插入的数据所存放的位置:/user/hive/warehouse/learn2.db/partition_student

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第2张图片

覆盖原先分区中的数据:

格式:load data local inpath "本地路径" overwrite into table 表名 PARTITION(分区字段 = 值)

覆盖文科一班的数据:

load data local inpath "/usr/local/soft/hive-3.1.2/data/新文科一班.txt" overwrite  into table learn2.partition_student PARTITION(clazz="文科一班");

查询结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第3张图片

创建一个外部分区表:

CREATE EXTERNAL TABLE IF NOT EXISTS learn2.partition_student2(
id STRING COMMENT "学生id",
name STRING COMMENT "学生姓名",
age int COMMENT "年龄",
gender STRING COMMENT "性别"
) PARTITIONED BY (clazz STRING COMMENT "班级")
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;

 加载数据到表中:

load data local inpath "/usr/local/soft/hive-3.1.2/data/文科一班.txt" into table learn2.partition_student2 PARTITION(clazz="文科一班");
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科二班.txt" into table learn2.partition_student2 PARTITION(clazz="文科二班");

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第4张图片  

查询分区:

格式:show partitions 表名;

举例:查询外部分区表partition_student2的分区:

show partitions partition_student2;

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第5张图片

 删除分区:

格式:alter table 表名 drop PARTITION(分区字段=值)

举例:删除外部表中的文科二班的分区

alter table learn2.partition_student2 drop PARTITION(clazz="文科二班");

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第6张图片

由于创建的是外部表,所以在删除分区后只能删除hive中的元数据,存储在hdfs上的数据依然存在。

hdfs中查看:Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第7张图片 但若是一个内部表,在删除分区时会将hive中和hdfs中的数据一并删除。

删除内部表partition_student中的分区文科二班:

alter table learn2.partition_student drop partition(clazz="文科二班");

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第8张图片

在hdfs中相应的数据也被删除掉:

恢复分区:

 格式:msck repair table 表名;

恢复刚刚删除的两个表的分区:

msck repair table learn2.partition_student;
msck repair table learn2.partition_student2;

结果:partition_student中的分区:

 Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第9张图片 partition_student2中的分区:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第10张图片 结果发现:只有外部表可以恢复被删除的分区,内部表无法恢复被删除的分区

原因:外部表中的数据同数据存储位置无关,恢复分区时会自动扫描数据存储位置下的数据并重新加载到该表中。

强制删除分区(慎用):

格式:dfs -rmr hdfs路径

从hdfs中删除数据:

dfs -rmr /user/hive/warehouse/learn2.db/partition_student2/clazz=文科二班

添加分区:

格式:alter table 表名 add PARTITION(分区字段=值)

为partition_student2添加分区理科一班:

alter table learn2.partition_student2 add partition(clazz="理科一班");

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第11张图片

 通过-put上传数据到表中:

dfs -put /usr/local/soft/hive-3.1.2/data/理科一班.txt /user/hive/warehouse/learn2.db/partition_student2/clazz=理科一班/;

查看结果:

增加动态分区操作

set hive.exec.dynamic.partition=true;   设置开启动态分区

set hive.exec.dynamic.partition.mode=nostrict;    设置动态分区的模式为非严格模式

set hive.exec.max.dynamic.partitions.pernode=1000;  设置分区的最大分区数

在hive中执行上述步骤:

 插入格式:

            INSERT INTO TABLE 表名 PARTITION(分区字段) SELECT查询语句

            分区的规则:默认是查询语句中后几列

 改为使用hive操作,退出JDBC,按下ctrl+C即可退出,输入hive即可进入到hive中

创建分区表partition_student3,使用动态分区格式向表中插入数据:

CREATE TABLE IF NOT EXISTS learn2.partition_student3(
id STRING COMMENT "学生编号",
name STRING COMMENT "学生姓名",
age STRING COMMENT "年龄",
gender STRING COMMENT "性别"
) PARTITIONED BY (clazz STRING COMMENT "班级")
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;
-- 插入数据:
INSERT INTO TABLE learn2.partition_student3 PARTITION(clazz) select id,name,age,gender,clazz from learn2.partition_student2;

结果:这里查询只显示十行数据

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第12张图片

异常情况:

 当在创建完分区表之后,向表中加载数据时报以下错误:

FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict

该错误表示动态分区未开启。

解决办法:需要重新执行上述开启动态分区设置的步骤,然后在重新加载数据至表

创建多级分区:

格式:将所要创建的分区加入到PARTITIONED BY中,不同分区之间使用逗号分隔

创建分区表learn.partition_student4,分区设置为班级和性别:

CREATE TABLE IF NOT EXISTS learn2.partition_student4(
id STRING COMMENT "学生编号",
name STRING COMMENT "学生姓名",
age STRING COMMENT "年龄"
) PARTITIONED BY (clazz STRING COMMENT "班级", gender STRING COMMENT "性别")
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;

查看其中的信息:分区字段有两个

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第13张图片

 插入数据:

load data local inpath "/usr/local/soft/hive-3.1.2/data/文科一班女.txt" into table learn2.partition_student4 PARTITION(clazz="文科一班",gender="女");
load data local inpath "/usr/local/soft/hive-3.1.2/data/文科二班男.txt" into table learn2.partition_student4 PARTITION(clazz="文科二班",gender="男");

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第14张图片

进入到hdfs中查看其数据保存目录:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第15张图片 分别进入两个目录中:

文科一班:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第16张图片

文科二班:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第17张图片

由此可见:

多级分区的特点:

 1、查询和分区操作时,格式为:clazz=文科一班/gender=女

2、在HDFS上多级分区表现为多层级目录

3、根据具体的数据情况进行区分,尽量将大一级划分放在前面

4、多级分区常用来将数据按天进行存储

数据加载

表中数据的加载一般有三种方式加载数据

创建partition_student5表,表中字段和之前的字段相同。

CREATE TABLE IF NOT EXISTS learn2.partition_student5(
id STRING COMMENT "学生编号",
name STRING COMMENT "学生姓名",
age STRING COMMENT "年龄",
gender STRING COMMENT "性别",
clazz STRING COMMENT "班级"
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;

load

通过load加载数据有两种格式:

1、通过HDFS上的数据加载数据至表中

格式:load data inpath "HDFS中的文件路径" into table 表名称

该操作需要先上传文件至HDFS中:

-- 创建HDFS根目录下的data文件夹
dfs -mkdir /data;

-- 上传文件到HDFS中
dfs -put "/usr/local/soft/hive-3.1.2/data/理科一班.txt" /data;

此时HDFS中有一个data目录,该目录下有文件理科一班.txt:

通过HDFS上的文件加载数据:

load data inpath "/data/理科一班.txt" into table learn2.partition_student5;

查询数据结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第18张图片

成功插入后,data中的源数据会移动到表目录下,data中此时不会有任何数据存在:

2、 通过本地文件系统上传数据至表中

格式1:load data local inpath "本地文件路径" into table 表名称

格式2(覆盖上传):load data local inpath "本地文件路径" overwrite into table 表名称

直接通过本地文件上传并加载数据到表中:

load data local inpath "/usr/local/soft/hive-3.1.2/data/文科一班女.txt" into table learn2.partition_student5;

查询结果:partition_student5中的内容

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第19张图片

 此时在HDFS下查看当前表目录下的文件:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第20张图片

会生成一个与本地文件相同名称的文件,但没有移动本地文件到该目录下,本地文件中的源数据不变

总结:

1、通过HDFS的数据加载至表中时,源路径下的数据会移动至表目录下

2、通过本地数据加载至表中时,本地数据的源数据不变,该表目录下会生成一个另外的相同文件

HDFS 

直接通过HDFS中的put方法将复制本地文件到表目录下:

注意:该操作在创建表时,数据的存储格式需要与复制数据的格式对应

格式:dfs -put "本地文件路径" 表所在路径;

INSERT

格式1:

INSERT INTO TABLE 表名称 SELECT 查询语句;

创建表partition_student6:

CREATE TABLE IF NOT EXISTS learn2.partition_student6(
id STRING COMMENT "学生编号",
name STRING COMMENT "学生姓名",
age STRING COMMENT "年龄",
gender STRING COMMENT "性别"
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;

向其中插入数据:

INSERT INTO TABLE learn2.partition_student6 SELECT id,name,age,gender from learn2.partition_student5;

注意:在书写SELECT语句时需要保证查询语句中的字段与建表语句中的字段顺序一致,不然会导致数据错位。

结果:partition_student6中的内容

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第21张图片

格式2:

INSERT OVERWRITE TABLE 表名 SELECT 查询语句

通过查询的数据覆盖表中原有数据

AS SELECT

方式一:通过查询结果创建表,并输入数据:

格式:CREATE TABLE IF NOT EXISTS 表名 AS SELECT 查询语句;

CREATE TABLE IF NOT EXISTS learn2.partition_student7 AS SELECT id,name,age,gender FROM learn2.partition_student6;

结果:partition_student7中的内容

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第22张图片

方式二:只创建表不加载数据:

 格式:CREATE TABLE IF NOT EXISTS 表名 LIKE 已经存在的表;

CREATE TABLE IF NOT EXISTS learn2.partition_student8 LIKE learn2.partition_student5;

结果:partition_student8中的内容:无内容

LOCATION

 通过创建表并指定数据所在位置,然后再加载数据(数据已经存在于HDFS目录中)

IMPORT

该方式为从HDFS上的指定路径中导入表,导入表时可以指定新表名

格式:import table 表名 FROM "路径";

IMPORT TABLE learn2.partition_student9 FROM "/data/export_data";

import需要搭配export使用:

故在执行上述导入前先需要执行将数据导出到HDFS中的/data/export_data中,先看导出数据部分:export方法

查看结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第23张图片

数据导出(慎用)

数据的导出方式有多种:

INSERT

使用insert进行数据的导出:

格式1:INSERT OVERWRITE DIRECTORY "本地路径" SELECT 查询语句

格式2:INSERT INTO LOCAL DIRECTORY "路径" SELECT 查询语句

在导出时,若直接按照上述格式进行导出,导出后,在本地文件中查看内容时其中的内容会连接在一起,中间没有分隔符,所以可以在上述格式中的本地路径后加上设置分隔符ROW FORMAT DELIMITED FIELDS TERMINATED BY ","

先在本地中的data中创建一个文件夹output用于存放导出的文件

导出partition_student6中的内容

INSERT OVERWRITE LOCAL DIRECTORY "/usr/local/soft/hive-3.1.2/data/output" ROW FORMAT DELIMITED FIELDS TERMINATED BY "," SELECT id,name,age,gender FROM learn2.partition_student6;

查看内容:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第24张图片

导出的文件以编号格式命名, 查看具体内容:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第25张图片

 HDFS get 方法

格式:dfs -get 表所在路径 本地路径

将partition_stuedent4中的内容导出:

获取该表所在路径:

desc formatted partition_student4;

结果中有一个location表示该表的所在路径:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第26张图片

 导出数据:

dfs -get hdfs://master:9000/user/hive/warehouse/learn2.db/partition_student4 /usr/local/soft/hive-3.1.2/data/output;

查看结果:导出的文件将整个HDFS中的表下的目录导出,

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第27张图片

这是因为partition_student4是一个分区表,有分区数据,而分区数据都存放在不同的子目录下,所以导出的是一个目录 

hive -e

格式 : hive -e "SQL语句" > 本地文件系统

hive -e "SQL语句"表示通过-e将SQL语句传入Cli并执行,最后退出Cli

>表示Linux中的重定向,将导出的数据重定向到本地文件系统中

根据以上分析,该操作应当在本地文件系统中执行:

hive -e "SELECT * FROM learn2.partition_student6" > /usr/local/soft/hive-3.1.2/data/output/partition_student6.txt

查询结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第28张图片

 export方法 

export方法进行导出数据,所导出的数据包含数据及其表的元数据信息

格式:export table 库.表名 to HDFS中的路径

export table learn2.partition_student6 to "/data/export_data"

查看数据信息:元数据信息中包括其配置信息,每个字段的注释等信息

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第29张图片

数据类型

Hive中的数据类型有基本数据类型,日期类型和复杂数据类型

基本数据类型:

TININT:微整型,只占用1个字节

SMALLINT:小整型,占用2个字节

INT:整型,占用4个字节

BIGINT:长整型,占用8个字节

布尔型BOOLEAN:TRUE/FALSE

浮点型FLOAT:单精度浮点数,一般情况下很少使用

DOUBLE:双精度浮点数

字符串型STRING:不设定长度

日期类型:

Timestamp:

格式:YYYY-MM-DD HH:MM:SS fffffffff(九位小数精度)

Date:

DATE值描述特定的年/月/日,格式为YYYY-MM-DD

复杂数据类型

ARRAY使用

array表示的是一个数组类型

创建语句:

CREATE TABLE learn2.person(
name string,
work_location array
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
COLLECTION ITEMS TERMINATED BY ",";

创建结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第30张图片

解释:

ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t":设置各字段之间的分隔符为制表符

COLLECTION ITEMS TERMINATED BY ",":设置array中各元素之间的分隔符为逗号

上传数据:通过put上传数据,将本地文件中的arrayTest.txt文件上传至表中

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第31张图片

dfs -put /usr/local/soft/hive-3.1.2/data/ArrayTest.txt  hdfs://master:9000/user/hive/warehouse/learn2.db/person

查询:根据指定字段进行查询时,若查询的是array类型,可以加入下标获取指定数据

-- 查询全部内容
SELECT * FROM learn2.person;  
-- 查询指定字段的下标
SELECT work_location[0], work_location[1] FROM learn2.person;

 结果:查询全部内容:

查询指定字段的下标:

  

MAP使用

map类型是hive中的集合类型

创建表语句:

create table learn2.score(name string, score map )
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' --列的分隔符
COLLECTION ITEMS TERMINATED BY ','  -- 集合的分隔符
MAP KEYS TERMINATED BY ':';    -- 每个KV数据对的分隔符

加载数据:

将本地下的score.txt文件上传至表中:

dfs -put /usr/local/soft/hive-3.1.2/data/score.txt hdfs://master:9000/user/hive/warehouse/learn2.db/score

查询结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第32张图片

查询数学成绩: 

SELECT score["'数学'"] FROM learn2.score;

结果:

Struct使用

创建数据表

CREATE TABLE test(id int,course struct )
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' --列分隔符
COLLECTION ITEMS TERMINATED BY ','; -- 集合分隔符

加载与查询数据:

-- 加载数据
dfs -put /usr/local/soft/hive-3.1.2/data/struct.txt hdfs://master:9000/user/hive/warehouse/learn2.db/test
-- 查询数据
SELECT course.score FROM learn2.test;

结果:

注意:struct就相当于一个对象通过 列名.属性 获取里面的数据

数据类型转换

数据类型的转换是使用cast方法进行转换:

1.强制转换小数型为int

select cast("1.1" as int);转换结果为1

2.小数转字符串

select cast(1.1 as STRING);转换结果为1.1,但是数据类型为String类型

简单数据查询语言DML

where

hive中的where语句用于过滤,分区裁剪,需要指定条件

格式为:where + 过滤条件

过滤条件同mysql相同,一般有between; in; is NULL; IS NOT NULL; > < = ! 等

如果多个存在多个过滤条件 可以用 AND OR 进行条件关联,或者是用NOT进行条件结果取反

JOIN

join用于两表之间进行关联,关联方式有:

内连接,左外连接,右外连接,自连接,满连接

注意:关联时一定要跟上关联条件

格式:SELECT 查询条件 FROM 表1 join方式 表2 ON 连接条件;

以员工表和部门表进行简单举例:

-- 创建员工表
create table learn2.emp(
    EMPNO int
    ,ENAME string
    ,JOB string
    ,MGR int
    ,HIREDATE string
    ,SAL int
    ,BONUS int
    ,DEPTNO int
) 
row format delimited
fields terminated by ',';
--加载数据:
load data local inpath "/usr/local/soft/hive-3.1.2/data/emp.txt" into table learn2.emp;
-- 创建部门表
create table learn2.dept(
    DEPTNO int
    ,DEPTNAME string
    ,DEPTADDR string
) 
row format delimited
fields terminated by ',';
--加载数据
load data local inpath "/usr/local/soft/hive-3.1.2/data/dept.txt" into table learn2.dept;

为了使结果更加明确,这里切换为使用JDBC连接操作:

查看员工表与部门表的内容:

员工表:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第33张图片部门表:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第34张图片  

内连接举例:

SELECT  
T1.DEPTNAME
,T2.ENAME
FROM learn2.dept T1 JOIN learn2.emp T2 ON T1.DEPTNO = T2.DEPTNO;

结果:将两个表相连取出其中的部门名称和员工名称:
Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第35张图片

 其他连接与内连接相似,只需将join改为相应的join方式即可,join方式与mysql类似

GROUP BY

group by表示分组聚合

需求:统计每个部门下的员工数:

SELECT
T1.DEPTNO
,count(*) as num 
FROM learn2.emp T1 GROUP BY T1.DEPTNO

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第36张图片

排序

ORDER BY

用于全局排序,要尽量避免排序,是针对全局排序的,即对所有的reduce输出是有序的

在实际处理数据过程中,要尽量避免使用全局排序

对薪资进行倒序排序:

SELECT
T1.ENAME
,T1.SAL
FROM learn2.emp T1 ORDER BY T1.SAL desc;

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第37张图片

set mapreduce.job.reduces; 表示查看当前reduce数量

set mapreduce.job.reduces = 3;表示设置当前reduce数量为3 

在设置reduce数量为3后,再次执行order by,reduce数量仍然为1

order by中的reduce数量默认只能为1  

 SORT BY

SELECT
T1.ENAME
,T1.SAL
FROM learn2.emp T1 SORT BY T1.SAL desc;

结果同order by结果相同

但在设置完reduce数量为3后,查询出的结果为乱序

原因是将reduceTask设置为了三个,所排序的是每个reduceTask中的内容,而reduceTask之间并没有排序,故最终显示为乱序,但是仍然是分区内有序

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第38张图片 

sort by的特点是分区内有序,分区间无序

多字段排序只需要将所要排序的字段加上即可,多个字段之间使用逗号分隔:

-- 以编号升序,薪资倒序进行排序
SELECT
T1.DEPTNO
,T1.SAL
FROM learn2.emp T1 SORT BY T1.DEPTNO, T1.SAL desc;

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第39张图片

distribute by

一般与sort by搭配使用进行排序

distribute by:指定按某列数据进行分区操作,和MR学习中的自定义分区类似 

-- 按照部门编号分区进行薪资排序
SELECT
T1.DEPTNO
,T1.SAL
FROM learn2.emp T1 distribute by T1.DEPTNO SORT BY T1.SAL desc;

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第40张图片

 cluster by

cluster by也表示排序操作,但是不能对数据做倒序, cluster by 表示对一个列数据进行分区排序

SELECT
T1.SAL
FROM learn2.emp T1 cluster by T1.SAL;

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第41张图片

distinct 

去重操作:

-- 查看薪资去重
SELECT
DISTINCT T1.sal
FROM learn2.emp T1

结果:和上一例对比,发现其中的

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第42张图片

函数的基本使用

查看函数

查看函数有三种方式进行查看:

1、SHOW FUNCTIONS 查看所有支持的函数,一共289个

2、SHOW FUNCTIONS LIKE "**" 模糊查询函数名

3、DESC FUNCTION+函数名 可以查看函数的具体使用方法

IF函数

格式:IF(判断条件,为TRUE所返回的内容,为FALSE所返回的内容)

举例:

-- 判断薪资是否大于一千,大于则为高收入,否则为低收入
SELECT
T1.ENAME
,IF(T1.SAL > 1000,"高收入","低收入") as if_sal
FROM learn2.emp T1

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第43张图片

 CASE WHEN 函数

格式:

CASE WHEN 判断条件1 THEN 如果为TURE返回THEN后的值, 
               WHEN 判断条件2 THEN 如果为TURE返回THEN后的值, 
               ELSE 以上都不满足,则返回ELSE后的值
          END

举例:将收入分为三等分

SELECT
T1.ENAME
,CASE WHEN T1.SAL > 3000 THEN "高收入"
 WHEN T1.SAL <= 3000 AND T1.SAL > 1000 THEN "中收入"
 ELSE "低收入" END case_when_sal
FROM learn2.emp T1

结果: 

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第44张图片 

注意:如果需求中只有一个判断,那么使用IF函数更为方便,否则则使用 CASE WHEN 

日期函数

unix_timestamp():获取从开始时间(1970-01-01 00:00:00)到当前时间的时间戳

unix_timestamp(String date):获取从开始时间到指定时间的时间戳

select unix_timestamp(from_unixtime(unix_timestamp()));

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第45张图片

 

字符串函数

字符串拼接:

使用concat实现字符串的拼接:

--使用/拼接前后两个字段
SELECT CONCAT(T1.EMPNO,"/",T1.ENAME) FROM learn2.emp T1

使用concat_WS进行多个字段的拼接
SELECT CONCAT_WS("/",CAST(T1.EMPNO AS STRING),T1.ENAME) FROM learn2.emp T1

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第46张图片  

注:CONCAT_WS需要提供STRING类型数据,如果不满足可以通过CAST将数据类型进行转换

字符串截取函数

通过字符串截取函数对指定字符串进行截取:

-- 获取当前日期并显示到年月
SELECT SUBSTRING(CURRENT_DATE,1,7);

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第47张图片

 

切分函数

split函数用于将字符串按照指定字符进行切分:

-- 将字符串按指定字符切分:
select split('abtcdtef','t');

结果:

Day57 Hive 分区表、数据加载和导出,简单数据查询以及函数_第48张图片 

可以看出该操作返回的数据类型为复杂数据类型Array

你可能感兴趣的:(笔记,hive)