重温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;

 

posted @ 2021-11-21 19:53  Shydow  阅读(35)  评论(0编辑  收藏  举报