hive外部表新增字段 hive如何定义外部表_hive load data外部表报错


概述:

hive是hadoop家族成员,是一种解析like sql语句的框架,它封装了常用的MapReduce任务,让你像执行sql一样操作存储在HDFS的表。

hive的表分为两种,外部表和内部表。

hive创建内部表时,会将数据移动到数据创库指向的路径;若创建外部表,仅记录数据所在的路径不对表数据的位置做任何的改变。

在删表的时候,内部表的元数据和数据会被一起删除,而外部表只会删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享数据。

hive的内外表,还有一个Partition的分区知识点,用于避免全表扫描,快速检索。

下面是hive的详细总结:

hive是数据仓库

数据库和数据仓库的区别

用途:分析,决策类影响

hive搭建

注意:搭建是按照元数据的存储和管理进行搭建的

搭建方式

1、使用hive自带的内存数据库derby

不用

2、使用单机的MySQL数据库,通过网络来访问元数据

使用较多

3、使用远程元数据服务的方式,实现hive和关系型数据库的解耦

使用较多

hive DDL

创建数据库

create database databaseName

创建表

1、create table tablename(col dateType...) row format dilimited fields terminated by '' collection items terminated by '' map keys terminated by ''| serde(正则)

2、create table tablename as select_statement

数据和表结构都有

3、create table tablename like tablename

只有表结构

内部表和外部表

创建

内部表不需要指定数据存储的路径,直接将数据存储在默认的目录中

外部表需要使用external关键字指定,需要使用location指定存储数据的位置

删除

内部表的数据和元数据都是由hive来管理的,删除的时候全部删除

外部表的数据由hdfs管理,元数据由hive管理,删除的时候只删除元数据,数据不会删除

hive的优化

核心思想

将hive的优化当作时MR去优化

优化策略

1、可以查看sql的执行计划

2、抓取策略

3、本地模式

4、并行模式

5、严格模式(strict nonstrict)

使用严格模式后会禁止一些查询

6、map端聚合

7、join

1、当多表连接的时候尽可能多的使用相同的连接键

2、将小表尽量放在左边

3、map端join(将小表的数据加载到内存中)

手动

/*+ mapjoin(smalltable)*/

自动

默认将坐标的表当作小表

根据文件大小来判断大表还是小表

8、排序

order by

会将所有的数据加载到一个reduce中

sort by

保证每个reduce数据有序

distributed by

保证分区有序

clustered by

等同于sort by + distributed by,但是不能指定排序策略

注意:

推荐使用sort by + distributed by结合使用

9、map和reduce个数的设置

map task的个数是由切片决定的

reduce是设置的

1、数据量

2、数据字段可能产生的key的个数

10、重用jvm

适用场景

小文件过多

task过多

使用

预先s申请一部分task的资源,当任务开始执行的时候,占用资源,不用去频繁申请销毁资源

注意

当整个job执行完成之后,才会释放所有资源,所以task的资源个数需要进行测试

hive的权限

分类

1、基于元数据的权限管理

2、基于sql标准的权限管理

3、基于第三方的权限管理

4、默认的权限管理方式

基于sql标准权限管理(hiveserver2)

概念

用户

使用者

角色

一组权限的集合

public

admin

角色的控制

create role rolename

show roles

show current roles

drop role rolename

权限的分配和回收

grant

revoke

hive的索引

创建

create index index_name on tablename(col) as '索引器' in table tablename(存储索引数据)

注意:

1、hive不会自动创建索引

2、创建索引时,执行 ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

3、每次新增数据之后都需要重新创建索引

hive的视图

创建

create view view_name as select statement

注意:

1、只能做查询,不能insert或者load数据

2、hive执行迭代视图

3、hive不支持物化视图

4、如果使用orderby,视图的优先级高

hive的运行方式

1、cli

1、提交sql语句

2、跟hdfs交互

3、跟本地文件系统交互

2、脚本

hive -e "sql"

hive -e "sql" >aa.txt

hive -S -e "sql"

hive -f file

hive -i file

在cli中执行source file

3、web ui

hwi

一般不用

hue

4、jdbc

hive的分桶

应用场景

1、数据抽样

2、事务支持

使用

设置允许分桶的参数

注意:分桶表在执行的时候,reduce task的个数跟桶的个数保持一致

tablesample(bucket x out of y)

x:从哪个桶开始抽取数据

y:桶的个数的倍数或者因子,一般是使用因子

hive参数

分类

--hiveconf

类似于在hive-site.xml中配置

System

系统变量

env

环境变量

--hivevar

自定义变量

设置方式

1、在hive-site.xml中设置,是全局有效

2、在hive --hiveconf key=value 当前会话有效

3、进入命令行之后,set key=value 当前会话有效

4、在当前用户的家目录下设置.hiverc的文件,每次进入命令行的时候,都会读取当前文件

注意:

在当前用户的家目录下有一个.hivehistrory,记录所有的历史命令

hive的分区

目的:方便提高检索效率

展现形式:再hdfs目录上创建多级目录

hive分区的分类

静态分区

静态分区的值是人为指定的

动态分区

分区列的值是由记录的某一列值来决定的

设置参数:允许动态分区,默认是是true,动态分区的模式:nostrict或者strict

使用动态分区的时候需要使用insert statement语句

添加分区(静态分区)

alter table tablename add parition(col=val)

修复分区

分区是作为元数据存储在MySQL中的,当hdfs路径中包含多级目录,同时存在分区列的是,可以创建外部表使用,但是分区的元数据没有在MySQL中存储,查不到数据

msck repair table tablename

Hive函数

hive本身自带了很多内嵌函数

字符函数

数值函数

日期函数

复杂类型函数

条件函数

函数的分类

udf

一进一出

udaf

多进一出

udtf

一进多出

自定义函数

1、编写Java代码继承UDF类

2、实现evaluate方法,所有实现的核心逻辑写到此方法中

3、将写好的代码打成jar包

4、将jar包上传到本地linux或者hdfs

5、如果是本地linux,在hive客户端执行add jar path;

create temporary function func_name as 'package+class'

6如果是hdfs,直接创建函数

create function func_name as 'package+class' using 'jar在hdfs上的路径'

DML

1、load data local inpath '' overwrite/into table tablename (partition)

2、from ... insert overwrite/into tablename select ...

3、insert into table values()

4、insert into local directory dic.. select-statement

想要使用删除和修改必须要经过事务,需要配置事务

限制

1、rollback,commit不支持

2、必须是orc的文件格式

3、表必须被分桶

4、默认事务是不开启的

以上。