數倉開發之ODS層

来源:https://www.cnblogs.com/JavaEdge/p/18075354
-Advertisement-
Play Games

優秀可靠的數倉體系,需要良好的數據分層結構。合理的分層,能夠使數據體系更加清晰,使複雜問題得以簡化。以下是該項目的分層規劃。 1 設計要點 (1)ODS層的表結構設計依托於從業務系統同步過來的數據結構 (2)ODS層要保存全部歷史數據,故其壓縮格式應選擇壓縮比較高的,此處選擇gzip (3)ODS層 ...


優秀可靠的數倉體系,需要良好的數據分層結構。合理的分層,能夠使數據體系更加清晰,使複雜問題得以簡化。以下是該項目的分層規劃。

1 設計要點

(1)ODS層的表結構設計依托於從業務系統同步過來的數據結構

(2)ODS層要保存全部歷史數據,故其壓縮格式應選擇壓縮比較高的,此處選擇gzip

(3)ODS層表名的命名規範為:ods_表名_單分區增量全量標識(inc/full)。

2 相關表

2.1 整車日誌表(增量日誌表)

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';

2.2 汽車信息表(全量表)

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';

3 數據裝載

#!/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表 中。

關註我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都技術專家兼架構,多家大廠後端一線研發經驗,各大技術社區頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統性能優化
  • 活動&優惠券等營銷中台建設
  • 交易平臺及數據中台等架構和開發設計

目前主攻降低軟體複雜性設計、構建高可用系統方向。

參考:

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、介紹 Promise,譯為承諾,是非同步編程的一種解決方案,比傳統的解決方案(回調函數)更加合理和更加強大 在以往我們如果處理多層非同步操作,我們往往會像下麵那樣編寫我們的代碼 doSomething(function(result) { ...
  • C語言中抽象函數與具體實現的命名與組織 在C語言的項目開發中,尤其是嵌入式系統和開源軟體項目里,合理地命名和組織抽象函數及其具體實現對於提高代碼的可讀性、可維護性和可擴展性至關重要。以下是關於如何在這些項目中有效地處理抽象和實現的一些建議: 抽象函數與具體實現的區分 API作為介面:API定義了一組 ...
  • Java 線程 線程使程式能夠通過同時執行多個任務而更有效地運行。 線程可用於在不中斷主程式的情況下在後臺執行複雜的任務。 創建線程 有兩種創建線程的方式。 擴展Thread類 可以通過擴展Thread類並覆蓋其run()方法來創建線程: public class MyThread extends ...
  • OI 一場空,不開 long long 見祖宗 cmp,一定要在 sort 里寫入 打 st 表一定要算空間複雜度 打倍增 LCA 一定要算空間複雜度 註意 ÷0 線段樹 4 倍空間 無向圖,鏈式前向星 2 倍空間 樹鏈剖分要註意是原編號還是 dfn 序的編號 鏈式前向星遍歷圖的時間複雜度永遠為 + ...
  • 一、數據類型 定義: 就是用了保存數據的一個類型,一種數據類型,只能保存該類型數據值 作用: 只有瞭解數據類型,才能選擇合適的類型存放數據,才能更好的利用電腦硬體資源(記憶體和硬碟等)。 不同的數據類型存放數據大小是不同的。 數據類型的使用方式就是用來聲明一個變數,裝數據的。 常用的整數類型是 in ...
  • 在開發過程中,碰到需要在 Python Django 項目中連接到位於 ECS 上但未開通外網地址的 RDS 資料庫。 這種情況下,通過建立 SSH 隧道來實現連接,確保數據傳輸的安全性和可靠性。 1、安裝 sshtunnel 包 pip3 install sshtunnel 2、導入 SSHTun ...
  • 在MyBatis中,如果你使用resultType而不是resultMap,並且結果集中有同名欄位,則預設情況下後出現的欄位值會覆蓋前面的欄位值。這是因為MyBatis在將結果集映射到Java對象時,是按照欄位名稱一一對應進行賦值的。 但若你希望更精確地控制映射關係,並且避免自動覆蓋行為,則可以用r ...
  • 當開發者意識到代碼庫開始變得般混亂不堪時,就會在現有項目中引入狀態機。狀態機的引入有助於將複雜多變的應用程式狀態轉換過程組織得更為有序和清晰,從而避免代碼陷入難以維護的境地。 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...