一.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