重温hive的一些记录和想法
- 特殊数据类型
ARRAY,MAP,STRUCT
CREATE TABLE employee(
name string,
salary double,
subor array<string>,
dedu map<string, double>,
address struct<street:string, city:string, state:string, zip:int> )
ROW FORMAT DELIMITED
FIELDS TREMINATED BY '\u001'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
STORED BY TEXTFILE;
- 写时模式和读时模式
写时模式:数据在写入数据库时对模式进行检查;
读时模式:Hive不会在数据加载时进行验证,而是在查询时进行,当schema与文件数据不一致时,查询结果中会出现null值
- 外部表
CREATE EXTERNAL TABLE t_external(
hms int,
serverity string,
server string,
process_id int,
message string
) PARTITIONED BY (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
-- LOAD DATA 加载数据
LOAD DATA LOCAL INPATH '/app/data/server.dat' OVERWRITE INTO TABLE t_external PARTITION (dt='20211120');
-- ALTER 加载数据
ALTER TABLE t_external ADD PARTITION(dt='20211120') LOCATION 'hdfs://hadoop001:8020/data/server/20211120';
-- 冷热数据分离:将一个月以前的数据转储到OSS等廉价存储系统上,需要配置oss的jar
hadoop distcp /data/server/p_dy=2021/p_dym=12/* oss://bucket/server/202112
ALTER TABLE t_external_bak PARTITION(p_dym='202112') SET LOCATION 'oss://bucket/server/202112'
hdfs dfs -rmr /data/server/p_dy=2021/p_dym=12
- 静态分区与动态分区
静态分区:需要手动指定分区键
动态分区:默认没有开启,同时在动静分区混合使用时,需要将静态分区放在动态分区前面,将动态分区字段放到末尾,自动推断
-- 开启动态分区
set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partition.mode=notrict --表示所有分区可以是动态的
set hive.exec.max.dynamic.partitions.pernode=100 -- 允许创建的最大分区
INSERT INTO TABLE employees PARTITION(country, state)
SELECT ..., cty, st
FROM ods_bisy_emplyee;