ToB企服应用市场:ToB评测及商务社交产业平台

标题: 数仓开发之ODS层 [打印本页]

作者: 耶耶耶耶耶    时间: 2024-5-14 06:12
标题: 数仓开发之ODS层
优秀可靠的数仓体系,需要精良的数据分层结构。合理的分层,能够使数据体系更加清晰,使复杂问题得以简化。以下是该项目的分层规划。
1 计划要点

(1)ODS层的表结构计划依托于从业务系统同步过来的数据结构
(2)ODS层要生存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip
(3)ODS层表名的命名规范为:ods_表名_单分区增量全量标识(inc/full)。
2 干系表

2.1 整车日志表(增量日志表)
  1. CREATE EXTERNAL TABLE ods_car_data_inc
  2. (
  3.   `vin`                                      STRING  COMMENT '汽车唯一ID',
  4.   `car_status`                               INT     COMMENT '车辆状态',
  5.   `charge_status`                            INT     COMMENT '充电状态',
  6.   `execution_mode`                           INT     COMMENT '运行模式',
  7.   `velocity`                                 INT     COMMENT '车速',
  8.   `mileage`                                  INT     COMMENT '里程',
  9.   `voltage`                                  INT     COMMENT '总电压',
  10.   `electric_current`                         INT     COMMENT '总电流',
  11.   `soc`                                      INT     COMMENT 'SOC',
  12.   `dc_status`                                INT     COMMENT 'DC-DC状态',
  13.   `gear`                                     INT     COMMENT '挡位',
  14.   `insulation_resistance`                    INT     COMMENT '绝缘电阻',
  15.   `motor_count`                              INT     COMMENT '驱动电机个数',
  16.   `motor_list`                              ARRAY<STRUCT<
  17.                                                `id`: INT,
  18.                                                `status`: INT,
  19.                                                `rev`: INT,
  20.                                                `torque`: INT,
  21.                                                `controller_temperature`: INT,
  22.                                                `temperature`: INT,
  23.                                                `voltage`: INT,
  24.                                                `electric_current`: INT
  25.                                              >>      COMMENT '驱动电机列表',
  26.   `fuel_cell_voltage`                        INT     COMMENT '燃料电池电压',
  27.   `fuel_cell_current`                        INT     COMMENT '燃料电池电流',
  28.   `fuel_cell_consume_rate`                   INT     COMMENT '燃料消耗率',
  29.   `fuel_cell_temperature_probe_count`         INT     COMMENT '燃料电池温度探针总数',
  30.   `fuel_cell_temperature`                     INT     COMMENT '燃料电池温度值',
  31.   `fuel_cell_max_temperature`                 INT     COMMENT '氢系统中最高温度',
  32.   `fuel_cell_max_temperature_probe_id`        INT     COMMENT '氢系统中最高温度探针号',
  33.   `fuel_cell_max_hydrogen_consistency`        INT     COMMENT '氢气最高浓度',
  34.   `fuel_cell_max_hydrogen_consistency_probe_id`  INT COMMENT '氢气最高浓度传感器代号',
  35.   `fuel_cell_max_hydrogen_pressure`           INT     COMMENT '氢气最高压力',
  36.   `fuel_cell_max_hydrogen_pressure_probe_id`   INT    COMMENT '氢气最高压力传感器代号',
  37.   `fuel_cell_dc_status`                       INT     COMMENT '高压DC-DC状态',
  38.   `engine_status`                             INT     COMMENT '发动机状态',
  39.   `crankshaft_speed`                          INT     COMMENT '曲轴转速',
  40.   `fuel_consume_rate`                         INT     COMMENT '燃料消耗率',
  41.   `max_voltage_battery_pack_id`               INT     COMMENT '最高电压电池子系统号',
  42.   `max_voltage_battery_id`                    INT     COMMENT '最高电压电池单体代号',
  43.   `max_voltage`                              INT     COMMENT '电池单体电压最高值',
  44.   `min_temperature_subsystem_id`              INT     COMMENT '最低电压电池子系统号',
  45.   `min_voltage_battery_id`                    INT     COMMENT '最低电压电池单体代号',
  46.   `min_voltage`                              INT     COMMENT '电池单体电压最低值',
  47.   `max_temperature_subsystem_id`              INT     COMMENT '最高温度子系统号',
  48.   `max_temperature_probe_id`                  INT     COMMENT '最高温度探针号',
  49.   `max_temperature`                           INT     COMMENT '最高温度值',
  50.   `min_voltage_battery_pack_id`               INT     COMMENT '最低温度子系统号',
  51.   `min_temperature_probe_id`                  INT     COMMENT '最低温度探针号',
  52.   `min_temperature`                           INT     COMMENT '最低温度值',
  53.   `alarm_level`                              INT     COMMENT '报警级别',
  54.   `alarm_sign`                               INT     COMMENT '通用报警标志',
  55.   `custom_battery_alarm_count`                INT     COMMENT '可充电储能装置故障总数N1',
  56.   `custom_battery_alarm_list`                 ARRAY<INT> COMMENT '可充电储能装置故障代码列表',
  57.   `custom_motor_alarm_count`                  INT     COMMENT '驱动电机故障总数N2',
  58.   `custom_motor_alarm_list`                   ARRAY<INT> COMMENT '驱动电机故障代码列表',
  59.   `custom_engine_alarm_count`                 INT     COMMENT '发动机故障总数N3',
  60.   `custom_engine_alarm_list`                  ARRAY<INT> COMMENT '发动机故障代码列表',
  61.   `other_alarm_count`                         INT     COMMENT '其他故障总数N4',
  62.   `other_alarm_list`                          ARRAY<INT> COMMENT '其他故障代码列表',
  63.   `battery_count`                             INT     COMMENT '单体电池总数',
  64.   `battery_pack_count`                        INT     COMMENT '单体电池包总数',
  65.   `battery_voltages`                          ARRAY<INT> COMMENT '单体电池电压值列表',
  66.   `battery_temperature_probe_count`            INT     COMMENT '单体电池温度探针总数',
  67.   `battery_pack_temperature_count`             INT     COMMENT '单体电池包总数',
  68.   `battery_temperatures`                      ARRAY<INT> COMMENT '单体电池温度值列表',
  69.   `timestamp`                                 BIGINT  COMMENT '日志采集时间'
  70. )
  71. COMMENT '整车日志表'
  72. PARTITIONED BY (`dt` STRING COMMENT '统计日期')
  73. ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
  74. LOCATION '/warehouse/car_data/ods/ods_car_data_inc';
复制代码
2.2 汽车信息表(全量表)
  1. drop table if exists ods_car_info_full;
  2. CREATE EXTERNAL TABLE IF NOT EXISTS ods_car_info_full (
  3.   `id` string COMMENT '车辆唯一编码',
  4.   `type_id` string COMMENT '车型ID',
  5.   `type` string COMMENT '车型',
  6.   `sale_type` string COMMENT '销售车型',
  7.   `trademark` string COMMENT '品牌',
  8.   `company` string COMMENT '厂商',
  9.   `seating_capacity` int COMMENT '准载人数',
  10.   `power_type` string COMMENT '车辆动力类型',
  11.   `charge_type` string COMMENT '车辆支持充电类型',
  12.   `category` string COMMENT '车辆分类',
  13.   `weight_kg` int COMMENT '总质量(kg)',
  14.   `warranty` string COMMENT '整车质保期(年/万公里)'
  15. )
  16. COMMENT '整车信息表'
  17. PARTITIONED BY (dt string COMMENT '统计日期')
  18. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  19. LOCATION '/warehouse/car_data/ods/ods_car_info_full';
复制代码
3 数据装载
  1. #!/bin/bash
  2. APP='car_data'
  3. # 判断第二个参数是否填写 如果填写使用作为日期 如果没有填写 默认使用昨天作为日期
  4. if [ -n "$2" ]; then
  5.         # statements
  6.         do_date=$2
  7. else
  8.         do_date=`date -d '-1 day' +%F`
  9. fi
  10. case "$1" in
  11.   "ods_car_data_inc")
  12.     hive -e "LOAD DATA INPATH '/origin_data/car_data_ful1/$do_date' INTO TABLE $APP.ods_car_data_inc PARTITION (dt='$do_date');"
  13.     ;;
  14.   "ods_car_info_full")
  15.     hive -e "LOAD DATA INPATH '/origin_data/car_info_full/$do_date' INTO TABLE $APP.ods_car_info_full PARTITION (dt='$do_date');"
  16.     ;;
  17.   "all")
  18.     hive -e "LOAD DATA INPATH '/origin_data/car_data_ful1/$do_date' INTO TABLE $APP.ods_car_data_inc PARTITION (dt='$do_date');"
  19.     hive -e "LOAD DATA INPATH '/origin_data/car_info_full/$do_date' INTO TABLE $APP.ods_car_info_full PARTITION (dt='$do_date');"
  20.     ;;
  21.   *)
  22.     echo "Usage: $0 {ods_car_data_inc|ods_car_info_full|all}"
  23.     ;;
  24. esac
复制代码
确保在Hive加载数据之前,数据文件已经存在于对应的HDFS路径中,且表的分区字段名是正确的。在运行脚本之前,授予其执行权限,利用以下下令。然后根据你的需求执行脚本:
  1. ./your_script_name.sh ods_car_data_inc
  2. ./your_script_name.sh ods_car_info_full
  3. ./your_script_name.sh all 2024-03-11
复制代码
写好脚本,以后放入 dophinschedule 调理器每天跑就行。实现将 HDFS 数据载入 ods表 中。
关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都技能专家兼架构,多家大厂后端一线研发经验,各大技能社区头部专家博主。具有丰富的引领团队经验,深厚业务架构息争决方案的积累。
负责:
目前主攻降低软件复杂性计划、构建高可用系统方向。
参考:
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4