一.hive实现列自增

1.用row_number()函数生成代理键

insert into tbl_dim select row_number() over (order by tbl_stg.id)+t2.sk_max,
tbl_stg.* from tbl_stg cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;
--先查询最大代理键值,如果没有记录返回0,cross join笛卡尔积,row_number()生成行号

2.Hive内置自增列UDF的使用

add jar ${HIVE_HOME}/lib/hive-contrib-2.2.0.jar;
create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'; 

select row_sequence(), column1, column2, ... from tablename

insert into tbl_dim select row_sequence() + t2.sk_max, tbl_stg.* from tbl_stg   
cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;

二.hive元数据表

hive自己维护一套元数据,用户通过HQL查询时,hive首先结合元数据将HQL翻译成MapReduce去执行

Hive在启动时会加载两个配置文件,默认配置文件hive-default.xml及用户自定义文件hive-site.xml(格式类似)。当两个文件的配置参数值不一致时,以后者为准。其中hive-default.xml是hive-default.xml.template的一个副本。Hive在启动后会在元数据库中创建元数据字典信息表,如下

表名

说明

bucketing_cols

Hive表clustered by字段信息(字段名、字段序号)

columns

hive表字段信息(字段注释、字段名、字段类型、字段序号)

DBS

所有数据库的基本信息(数据库ID/数据库描述/数据库的HDFS路径/数据库名/数据库所有者用户名/所有者角色)

nucleus_tables

元数据表与hive中class类的对应关系

partitions

表分区信息(创建时间、具体的分区)

partition_keys

分区表分区键(名称、类型、comment、序号)

partition_keys_vals

表分区名(键值、序号)

SDS

所有hive表,表分区所对应的HDFS数据目录和数据格式

sequence_table

hive对象的下一个可用ID

serdes

hive表序列化反序列化使用的类库信息

serde_params

序列化反序列化信息,如行分隔符、列分隔符

sort_cols

表sorted_by字段信息(字段名,sort类型,字段序号)

table_params

表级属性,如是否外部表、表注释、totalSize、numRows等

TBLS

所有hive表(hive表+视图+索引表)的基本信息(表ID/创建时间/数据库ID/上次访问时间/所有者/保留字段/序列化配置信息/表名/表类型等).表类型:managed_table+external_table+index_table+virtual_table

version

存储hive版本(若该表出现问题,不能进入hive cli)

funcs

用户注册的函数信息

示例(hive创建表的整个过程):用户提交hiveql语句-对其进行解析-分解为表、字段、分区等hive对象-从sequence_table中获取对象的最新ID与构建对象信息(名称、类型等)一同通过DAO方法写入元数据表中,成功后sequence_table对应的最新ID+5