虽然hive中的表没有主键一说,但是实际数据开发中经常需要将hive中计算好的表导出到mysql库中供业务使用或开发调用,而mysql表是需要有主键的,在hive中我们可以使用row_number() over()窗口函数来生成一个自增序列的字段,在将表导出到mysql库中的时候就可以指定该字段为主键,使用起来还是挺方便的。
select
-- 自增序列字段
row_number()over() as row_number
-- 以下其他字段
, user_id
, col_name
-- 数仓系统字段
,'${wf:id()}' as load_job_number
, '${wf:name()}' as load_job_name
, current_timestamp as insert_timestamp
, 2 as source_system_code
from edw_tmp.tmp_table_name
where dt='${dt}'
使用sqoop将数据导出至mysql表
以下是mysql建表脚本
CREATE TABLE IF NOT EXISTS mysql_table_name(
row_number bigint(20) NOT NULL DEFAULT '0' comment '数仓自增行序号',
user_id bigint(20) NOT NULL DEFAULT '0' comment '用户idid',
col_name varchar(1000) DEFAULT NULL comment '其他字段名',
load_job_number varchar(1000) DEFAULT NULL comment '数据仓库调度工具oozie job单次运行id, 使用oozie EL function: ${wf:id()}',
load_job_name varchar(1000) DEFAULT NULL comment '数据仓库调度工具oozie_job名称: 使用oozie EL function: ${wf:name()}',
insert_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '数据仓库数据插入时间',
source_system_code INT(11) comment '数据仓库的源系统数据分类:1-二手房;2-新房;3-金融;4-租房',
dt varchar(8) NOT NULL comment '分区字段',
PRIMARY KEY (row_number,user_id,dt),
KEY user_id (user_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT '表名注释'
;