优秀可靠的数仓体系,需要良好的数据分层结构。合理的分层,能够使数据体系更加清晰,使复杂问题得以简化。以下是该项目的分层规划。
(1)ODS层的表结构设计依托于从业务系统同步过来的数据结构
(2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip
(3)ODS层表名的命名规范为:ods_表名_单分区增量全量标识(inc/full)。
CREATE EXTERNAL TABLE ods_car_data_inc ( `vin` STRING COMMENT '汽车唯一ID', `car_status` INT COMMENT '车辆状态', `charge_status` INT COMMENT '充电状态', `execution_mode` INT COMMENT '运行模式', `velocity` INT COMMENT '车速', `mileage` INT COMMENT '里程', `voltage` INT COMMENT '总电压', `electric_current` INT COMMENT '总电流', `soc` INT COMMENT 'SOC', `dc_status` INT COMMENT 'DC-DC状态', `gear` INT COMMENT '挡位', `insulation_resistance` INT COMMENT '绝缘电阻', `motor_count` INT COMMENT '驱动电机个数', `motor_list` ARRAY<STRUCT< `id`: INT, `status`: INT, `rev`: INT, `torque`: INT, `controller_temperature`: INT, `temperature`: INT, `voltage`: INT, `electric_current`: INT >> COMMENT '驱动电机列表', `fuel_cell_voltage` INT COMMENT '燃料电池电压', `fuel_cell_current` INT COMMENT '燃料电池电流', `fuel_cell_consume_rate` INT COMMENT '燃料消耗率', `fuel_cell_temperature_probe_count` INT COMMENT '燃料电池温度探针总数', `fuel_cell_temperature` INT COMMENT '燃料电池温度值', `fuel_cell_max_temperature` INT COMMENT '氢系统中最高温度', `fuel_cell_max_temperature_probe_id` INT COMMENT '氢系统中最高温度探针号', `fuel_cell_max_hydrogen_consistency` INT COMMENT '氢气最高浓度', `fuel_cell_max_hydrogen_consistency_probe_id` INT COMMENT '氢气最高浓度传感器代号', `fuel_cell_max_hydrogen_pressure` INT COMMENT '氢气最高压力', `fuel_cell_max_hydrogen_pressure_probe_id` INT COMMENT '氢气最高压力传感器代号', `fuel_cell_dc_status` INT COMMENT '高压DC-DC状态', `engine_status` INT COMMENT '发动机状态', `crankshaft_speed` INT COMMENT '曲轴转速', `fuel_consume_rate` INT COMMENT '燃料消耗率', `max_voltage_battery_pack_id` INT COMMENT '最高电压电池子系统号', `max_voltage_battery_id` INT COMMENT '最高电压电池单体代号', `max_voltage` INT COMMENT '电池单体电压最高值', `min_temperature_subsystem_id` INT COMMENT '最低电压电池子系统号', `min_voltage_battery_id` INT COMMENT '最低电压电池单体代号', `min_voltage` INT COMMENT '电池单体电压最低值', `max_temperature_subsystem_id` INT COMMENT '最高温度子系统号', `max_temperature_probe_id` INT COMMENT '最高温度探针号', `max_temperature` INT COMMENT '最高温度值', `min_voltage_battery_pack_id` INT COMMENT '最低温度子系统号', `min_temperature_probe_id` INT COMMENT '最低温度探针号', `min_temperature` INT COMMENT '最低温度值', `alarm_level` INT COMMENT '报警级别', `alarm_sign` INT COMMENT '通用报警标志', `custom_battery_alarm_count` INT COMMENT '可充电储能装置故障总数N1', `custom_battery_alarm_list` ARRAY<INT> COMMENT '可充电储能装置故障代码列表', `custom_motor_alarm_count` INT COMMENT '驱动电机故障总数N2', `custom_motor_alarm_list` ARRAY<INT> COMMENT '驱动电机故障代码列表', `custom_engine_alarm_count` INT COMMENT '发动机故障总数N3', `custom_engine_alarm_list` ARRAY<INT> COMMENT '发动机故障代码列表', `other_alarm_count` INT COMMENT '其他故障总数N4', `other_alarm_list` ARRAY<INT> COMMENT '其他故障代码列表', `battery_count` INT COMMENT '单体电池总数', `battery_pack_count` INT COMMENT '单体电池包总数', `battery_voltages` ARRAY<INT> COMMENT '单体电池电压值列表', `battery_temperature_probe_count` INT COMMENT '单体电池温度探针总数', `battery_pack_temperature_count` INT COMMENT '单体电池包总数', `battery_temperatures` ARRAY<INT> COMMENT '单体电池温度值列表', `timestamp` BIGINT COMMENT '日志采集时间' ) COMMENT '整车日志表' PARTITIONED BY (`dt` STRING COMMENT '统计日期') ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe' LOCATION '/warehouse/car_data/ods/ods_car_data_inc';
drop table if exists ods_car_info_full; CREATE EXTERNAL TABLE IF NOT EXISTS ods_car_info_full ( `id` string COMMENT '车辆唯一编码', `type_id` string COMMENT '车型ID', `type` string COMMENT '车型', `sale_type` string COMMENT '销售车型', `trademark` string COMMENT '品牌', `company` string COMMENT '厂商', `seating_capacity` int COMMENT '准载人数', `power_type` string COMMENT '车辆动力类型', `charge_type` string COMMENT '车辆支持充电类型', `category` string COMMENT '车辆分类', `weight_kg` int COMMENT '总质量(kg)', `warranty` string COMMENT '整车质保期(年/万公里)' ) COMMENT '整车信息表' PARTITIONED BY (dt string COMMENT '统计日期') ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/warehouse/car_data/ods/ods_car_info_full';
#!/bin/bash APP='car_data' # 判断第二个参数是否填写 如果填写使用作为日期 如果没有填写 默认使用昨天作为日期 if [ -n "$2" ]; then # statements do_date=$2 else do_date=`date -d '-1 day' +%F` fi case "$1" in "ods_car_data_inc") hive -e "LOAD DATA INPATH '/origin_data/car_data_ful1/$do_date' INTO TABLE $APP.ods_car_data_inc PARTITION (dt='$do_date');" ;; "ods_car_info_full") hive -e "LOAD DATA INPATH '/origin_data/car_info_full/$do_date' INTO TABLE $APP.ods_car_info_full PARTITION (dt='$do_date');" ;; "all") hive -e "LOAD DATA INPATH '/origin_data/car_data_ful1/$do_date' INTO TABLE $APP.ods_car_data_inc PARTITION (dt='$do_date');" hive -e "LOAD DATA INPATH '/origin_data/car_info_full/$do_date' INTO TABLE $APP.ods_car_info_full PARTITION (dt='$do_date');" ;; *) echo "Usage: $0 {ods_car_data_inc|ods_car_info_full|all}" ;; esac
确保在Hive加载数据之前,数据文件已经存在于对应的HDFS路径中,且表的分区字段名是正确的。在运行脚本之前,授予其执行权限,使用以下命令。然后根据你的需求执行脚本:
./your_script_name.sh ods_car_data_inc ./your_script_name.sh ods_car_info_full ./your_script_name.sh all 2024-03-11
写好脚本,以后放入 dophinschedule 调度器每天跑就行。实现将 HDFS 数据载入 ods表 中。
关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。
负责:
- 中央/分销预订系统性能优化
- 活动&优惠券等营销中台建设
- 交易平台及数据中台等架构和开发设计
目前主攻降低软件复杂性设计、构建高可用系统方向。
参考: