數倉開發之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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...