有勇气的牛排博客

hive数据类型、表创建、数据导入导出、动态分区Dynamic Partition

有勇气的牛排 771 大数据 2022-12-04 18:04:37

哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮

有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。

1 Hive基础数据类型

类型 Java数据类型 描述
tinyint byte 8位有符号整型,-128~127
smallint short 16位有符号整型,-32768~32767
int int 32位有符号整型,-231 ~ 231 -1
bigint long 64位有符号整型, -263+1 ~ 2 63 -1
binary 二进制数据类型,目前限制位8MB
float float 32位二进制浮点型
double double 64位二进制浮点型
decimal(percision,scale) 10进制精确数字类型。percision:表示最多可以表示多少位数字,1<=percision<=38。scale:表示小数部分的位数,0<=scale<=38,如果不指定两个参数,则默认位decimal(10,0)
varchar(n) 变长字符类型,n为长度,1~65535
char(n) 固定长度字符类型,n为长度,最大为255.长度不足则会填充空格,但空格不参与比较
string string 字符串类型,目前长度为8MB
date 日期类型,格式为 yyyy-mm-dd 00:00:00.000~9999-12-31 23:59:59.999,精确到秒
timestamp
boolean boolean boolean类型,取值True、False

1.1 复杂数据类型

类型 定义方法 构造方法
array
map
struct

https://www.douyin.com/user/MS4wLjABAAAAC5NbA1JCeuUfq9xXyi9UkRPlxTXxli4XWux9vqF46D4zcl0vlbs_8dmajmgLwAuJ?is_full_screen=0&modal_id=7037696402289380645&vid=7037406499148238091

2 数据库、表操作

2.1 创建数据库

create database if not exists cs

create schema cs defaultcharacter set utf8;

image.png

2.2 创建表

无分区

create table if not exists cs.article_nopar( aid int comment '文章id', nickname string comment '作者', time timestamp comment '时间戳', id_category int comment '分类id', id_date string ) row format delimited fields terminated by '\t' lines terminated by '\n';

有分区

create table if not exists cs.article( aid int comment '文章id', nickname string comment '作者', time timestamp comment '时间戳' ) partitioned by (id_category int comment '分类id', id_date string) row format delimited fields terminated by '\t' lines terminated by '\n';

row format delimited: 用来设置创建的表在加载数据的时候,支持的列分隔符。

fields terminated by: 字段与字段之间的分隔符。

lines terminated by: 设置每行数据结尾的字符。

2.3 删除表

删除表

drop table cs.article;

仅删除表中数据,保留表结构

truncate table cs.article;

2.4 修改表

表重命名

alter table cs.article rename to cs.article1;

增加表字段

# 添加email alter table cs.article add columns (a_type string);

2.5 查表

正则匹配查找表

show tables '*ar*';

查看表结构

desc cs.article;

image.png

查看所有表
image.png

3 数据导入

3.1 本地文件系统导入

首先,我们在本地文件系统创建测试内容

vim /home/charles/article.txt
1 灰太狼 1676650431 2 2022-02-18 2 有勇气的牛排 1676650432 2 2022-02-19 3 导演 1676650433 1 2022-02-20

然后在hive终端执行

load data local inpath '/home/charles/article.txt' into table cs.article_nopar;

查看导入的数据

hdfs dfs -cat /user/hive/warehouse/cs.db/article_nopar/article.txt;

truncate table cs.article_nopar;

select * from cs.article_nopar;

未分区数据导入有分区表

set hive.exec.dynamic.partition=true; -- 开启动态分区
set hive.exec.dynamic.partition.mode=nonstrict;



4 常用参数

-- 是否允许动态分区 set hive.exec.dynamic.partition=true; -- 动态分区的模式设置 set hive.exec.dynamic.partition.mode=nonstrict; -- 允许动态分区的最大数量 set hive.exec.max.dynamic.partitions=10000; -- 单个节点上的mapper/reducer允许创建的最大分区 set hive.exec.max.dynamic.partitions.pernode=10000; set mapred.child.java.opts=-Xmx8000m; set mapreduce.map.java.opts=-Xmx8096m; set mapreduce.reduce.java.opts=-Xmx8096m; set mapreduce.map.memory.mb=8096; set mapreduce.reduce.memory.mb=8096; set es.mapping.date.rich=false

5 动态分区

动态分区(dynamic partition): 指在插入数据到多个分散分区时,自动进行分区数据填充。

静态分区(static partition):分区由用户决定。

注意事项

  • 动态分区在insert数据的时候,分区字段要放在插入字段的最后面,同时要和指定的分区字段的顺序一致。
  • 尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
  • 动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
  • 动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
  • 动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数:hive.exec.dynamic.partition.mode。
  • hive用了动态分区,若select语句无数据,则insert overwrite并不会覆盖。因为动态分区由select决定,select语句无数据,分区也无法确定,故无法实现动态覆盖。此时想要修正表数据,需要手动删除该分区。

参数配置:

5.1 是否允许动态分区

使用动态分区时候,该参数必须设置成true

set hive.exec.dynamic.partition=true;

5.2 动态分区的模式设置

默认值:strict
strict模式:表示必须指定至少一个分区为静态分区。
nonstrict模式:表示允许所有的分区字段都可以使用动态分区。

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

5.3 单个节点上的mapper/reducer允许创建的最大分区

默认值:100
在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。

set hive.exec.max.dynamic.partitions.pernode=1000;

5.4 允许动态分区的最大数量

默认值:1000
在所有执行MR的节点上,最大一共可以创建多少个动态分区。

set hive.exec.max.dynamic.partitions=1500;

5.5 一个mapreduce作业能创建的HDFS文件最大数

默认值:100000
整个MR Job中,最大可以创建多少个HDFS文件。

set hive.exec.max.created.files=100000;

5.6 在动态分区插入产生空结果时是否抛出异常

默认值:false
当有空分区生成时,是否抛出异常。一般不需要设置。

set hive.error.on.empty.partition=false;

6 中文乱码

修改mysql数据库

alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

参考地址:

  • https://www.helloworld.net/p/1015206641
  • https://blog.csdn.net/qq_34224565/article/details/124869902

留言

专栏
文章
加入群聊