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;

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

结果:

分区表插入数据:

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

格式: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

覆盖原先分区中的数据:

格式: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="文科一班");

查询结果:

创建一个外部分区表:

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="文科二班");

结果:

  

查询分区:

格式:show partitions 表名;

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

show partitions partition_student2;

结果:

 删除分区:

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

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

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

结果:

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

hdfs中查看: 但若是一个内部表,在删除分区时会将hive中和hdfs中的数据一并删除。

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

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

结果:

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

恢复分区:

 格式:msck repair table 表名;

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

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

结果:partition_student中的分区:

  partition_student2中的分区:

 结果发现:只有外部表可以恢复被删除的分区,内部表无法恢复被删除的分区

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

强制删除分区(慎用):

格式: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="理科一班");

结果:

 通过-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中执行上述步骤:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值