-
路径
-
step1:目标
-
step2:问题
-
step3:需求
-
step4:分析
-
-
实施
-
目标:将已经采集同步成功的101张表的数据加载到Hive的ODS层数据表中
-
问题
-
难点1:表太多,如何构建每张表?
-
101张表的数据已经存储在HDFS上
-
建表
-
方法1:手动开发每一张表建表语句,手动运行
-
方法2:通过程序自动化建表
-
拼接建表的SQL语句
-
-
-
-
-
create external table 数据库名称.表名
comment '表的注释'
partitioned by
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
location '这张表在HDFS上的路径'
TBLPROPERTIES ('这张表的Schema文件在HDFS上的路径')
-
-
-
-
表名、表的注释、表在HDFS上的路径、Schema文件在HDFS上的路径
-
-
将SQL语句提交给Hive或者Spark来执行
-
-
-
申明分区
alter table 表名 add partition if not exists partition(key=value)
难点2:如果使用自动建表,如何获取每张表的字段信息?
-
Schema文件:每个Avro格式的数据表都对应一个Schema文件
-
统一存储在HDFS上
-
需求:加载Sqoop生成的Avro的Schema文件,实现自动化建表
-
分析
-
step1:代码中构建一个Hive/SparkSQL的连接
-
step2:创建ODS层数据库
-
create database if not exists one_make_ods;
step3:创建ODS层全量表:44张表
create external table one_make_ods_test.ciss_base_areas
comment '行政地理区域表'
PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'
TBLPROPERTIES ('avro.schema.url'='hdfs://bigdata.itcast.cn:9000/data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avsc');
-
读取全量表表名
-
动态获取表名:循环读取文件
-
-
获取表的信息:表的注释
-
Oracle:表的信息
-
从Oracle中获取表的注释
-
-
获取表的文件:HDFS上AVRO文件的地址
/data/dw/ods/one_make/full_imp
获取表的Schema:HDFS上的Avro文件的Schema文件地址
/data/dw/ods/one_make/avsc
拼接建表字符串
-
方式一:直接相加:简单
str1 = "I "
str2 = "like China"
str3 = str1 + str2
-
-
-
方式二:通过列表拼接:复杂
-
-
执行建表SQL语句
-
-
step4:创建ODS层增量表:57张表
-
读取增量表表名
-
动态获取表名:循环读取文件
-
-
获取表的信息:表的注释
-
Oracle:表的信息
-
从Oracle中获取表的注释
-
-
获取表的文件:HDFS上AVRO文件的地址
-
/data/dw/ods/one_make/incr_imp
-
获取表的Schema:HDFS上的Avro文件的Schema文件地址
/data/dw/ods/one_make/avsc
-
拼接建表字符串
-
执行建表SQL语句