hive概念&数据映射&分隔符&分区表&分桶&表操作&导出

1、HIVE的概念:
hive建表,和已存在的结构化的数据文件产生映射关系
建立映射之后,通过SQL代替底层MR程序执行命令,分析数据

2、映射关系与路径存放
数据库 对应文件夹 /user/hive/warehouse/fastdo_lte.db
表 对应文件夹 /user/hive/warehouse/fastdo_lte.db/tdlte_mro_locate_hour --数据库文件夹的子文件夹
表的数据文件,存放于指定的数据库表的文件夹下

eg: /user/hive/warehouse/fastdo_lte.db/tdlte_mro_locate_hour/tdlte_mro_locate_hour

3、分隔符:
建表时,需指定分隔符(分割FIELDS列、分割COLLECTION集合、分割MAP键值)
默认为’\001’或者’^A’

eg: 
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY char 
  NULL DEFINED AS char
  COLLECTION ITEMS TERMINATED BY char
  MAP KEYS TERMINATED BY char
  LINES TERMINATED BY char| SERDE serde_name
  WITH SERDEPROPERTIES

SERDE是指序列化、反序列化读取文件,然后按分隔符分割
如遇到特殊分隔符,可以利用序列化工具自定义正则表达式

4、分区表和分区字段的属性:
分区表字段不能是表中已存在字段
eg: tdlte_mro_locate_hour中已有sdate(timestamp),分区字段为day(20190211)、hour(00)
分区字段是虚拟字段,不存放任何数据,分区字段的赋值,是load分区表数据的时候指定的
分区表的字段实际hdfs存储效果,表的文件夹下创建了子文件夹

eg: /user/hive/warehouse/fastdo_lte.db/tdlte_mro_locate_hour/day=20190211/hour=00/tdlte_mro_locate_hour

分区效果:避免全表扫描,典型的空间换时间

5、分桶(分簇)的概念:
小声比比:效果同索引、序列,为提高检索效率。实现方法类似把外键归类,提前进行按表属性分组存放,典型空间换时间
实例eg:
AB两表,A(A1,A2) B(B1,A1,B2)。如果经常做连接查询 (select A.,B. from A LEFT JOIN B on A.A1=B.A1)
此时,将B表按照A1进行哈希存放,下次连接查询,可避免B表全表查询。
分桶(分簇)的操作:
使用之前,需要开启分桶功能
eg:

set hive.enforce.bucketing=true;  --设置分桶开启
set mapreduce.job.reduces=4;      --设置task数目,后续分桶和此数目一致

分桶表数据,应采用insert+select方式插入数据,插入的数据来自于查询结果(类似create table A as select * from B),
查询时调用了MR程序,MR按照partition读出,然后插入桶表
默认分桶规则,按照指定分桶字段clustered by哈希值
eg: insert overwrite table A select * from B cluster by(A1);

创建分桶表时,分桶字段必须是表中已存在字段
eg:和分区不同,分区是表中不存在字段,按照导入时规定进行填充分区字段值。
分桶是根据已有字段,进行分片记录存储。
分桶表load data无分桶效果,和普通表一致(load本质是hive方执行hadoop fs -put)

6、内部表外部表标识:create语句中是否有external
外部表数据文件不用放到默认路径下,建表时指定location
外部表删除的时候,hive不会删除数据文件,外部表不受hive管辖

7、like语句,类似pklsql as
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DB_NAME.]table_name LIKE existing_tables
复制结构不复制数据

8、hive表修改性操作
a\ 增加分区
ALTER TABLE table_name ADD PARTITION (day=‘20190211’) location ‘hdfs’; --添加一个分区
ALTER TABLE table_name ADD PARTITION (day=‘20190211’) location ‘hdfs1’ PARTITION (hour=‘00’) location ‘hdfs2’; --添加多个分区
b\ 删除分区
ALTER TABLE table_name DROP IF EXIST PARTITION (day=‘20190211’,‘hour=00’);
c\ 修改分区
ALTER TABLE table_name PARTITION (day=‘20190211’) RENAME TO PARTITION(day=‘2019-02-11’);
d\ 添加列
ALTER TABLE table_name ADD|REPLACE COLUMNS(col_name STRING);
e\ 修改列
test_change(a int, b int, c int);
ALTER TABLE test_change CHANGE a a1 int; --修改a字段名
ALTER TABLE test_change CHANGE a a1 STRING AFTER b; --a重命名为a1,切int改为string a1放到b列之后
ALTER TABLE test_change CHANGE b b1 INT FIRST; --b重命名为b1,b1列置首位
f\ 重命名
LTER TABLE test_change RENAME TO new_table_name;

9、 显示命令:
show tables;
show databases|schemas;
show partition table_name; – 显示表分区信息,不是分区表会报错
show functions; --当前hive支持的方法
desc extended table_name; --查看表信息
desc formatted table_name; --格式化查看表信息
describe database databese_name; --查看数据库相关信息

10、load

LOAD DATA [LOCAL] 'filepath' [OVERWRITE] INTO TABLE table_name [PARTITION (partcol1=cal1,...)]

加载操作是将数据文件移动到与hive表对应目录的纯复制\移动操作
指定local的话,在本地文件系统查找文件路径.(如果是远程登录,local为服务器端文件系统,因为命令的解释在服务器端)
指定overwrite 覆盖写入

11、insert
多表插入:–从A1表中读取A1、A2插入B1,A3、A4插入B2

from A
insert overwrite table B1 [PARTITION (partcol1=cal1,...)]
select A.A1,A.A2
insert overwrite table B2 [PARTITION (partcol1=cal1,...)]
select A.A3,A.A4

动态分区插入:

INSERT OVERWRITE TABLE table_name PARTITION (partcol1=cal1,...) select_statement from_statement
eg: insert overwrite A partition(day,hour) select B1,B2 as day,hour from B; --B为动态分区表

动态分区要设置功能开启:

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode=strict\nonstrict; --strict至少有一个静态分区 

注意:要保证读取插入字段和读取字段数目一致、类型一致。若类型不一致,HIVE会进行转换,转换不一定成功

12、导出表结构: --insert和from对象不同而已,双方均可为表结构和文件系统

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ... ;--单表导出

FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]... ; --多表导出

注意:OVERWRITE的对象如果是/root,会造成无法挽回的后果

13、select语句

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
[LIMIT number]

重点关注cluster by 和DISTRIBUTE BY:
cluster 分桶且桶内按照分桶字段排序
distribute 分桶然后再排序,搭配sort使用
eg:

select * from student cluster by(sno); --按照sno进行分桶,桶内按照sno排序
select * from student cluster by(sno) sort by(sage); --报错,已经进行了分桶,sort无效
select * from student distribute by (sno) sort by(sage); --按照sno排序,桶内按照sage排序

若均为同一字段,则:cluster by(sno)= distribute by (sno) sort by(sno);
order by全局排序,效率问题使用少。
sort by不是全局排序,只是在数据进入reducer之前完成排序。reducer>1时,不是全局有序

14、hive join
hive不支持非等值连接(a.id>b.id),难以转换为mr任务
join时,MR任务的逻辑:
reducer缓存join序列中,除最后那张表的所有记录。所以最大的表格应该放到join的最后
inner join对应full outer join,两者只是关联之后,显示的区别
cross join 笛卡尔积

15、hive参数配置
配置文件对全局有效;命令行参数对hive启动实例有效;参数声明对hive连接的session有效

用户自定义配置文件:$HIVE_CONF_DIR/hive-site.xml
默认配置文件:$hive_conf_dir/hive-default.xml

多了解常用配置参数,如指定队列,指定本地模式,指定分桶,指定动态等

16、hive开放性设置
hive有和oracle类似的的内置函数
可自定义函数UDF开发,通过继承evalute方法,自定义方法
通过TRANSFROM 传参进入python处理

你可能感兴趣的:(hadoop相关,hive,mysql,数据库)