Hive はどのように If else ロジックを実装し、条件に従って異なるテーブルのデータを取得し、データ ウェアハウスは上流のテーブル レコード動作 0 シーンを処理しますか?

バックグラウンド

上流のビジネス システムのテーブルで、バッチを切り捨ててから挿入すると、タスクが失敗し、データ ウェアハウスの ods レイヤーによって空のデータが抽出されます (レコード動作 0)。このテーブルは組織のディメンション テーブルであり、多数のダウンストリーム データ モデルがこのテーブルに依存しているため、多数のデータ例外が発生し、BI ユーザー エクスペリエンスに影響を与えます。

プラン

  • 解決策 1: 判断するためのスケジューリング ツール 当日の上流テーブルから抽出したデータが空の場合は、昨日の ods レイヤー データ (頻繁に変更されない組織構造のディメンション テーブル) を取得します。ただし、購入したデータ開発プラットフォームやスケジューリングツールは類似分岐判定に対応していません。Dophinscheduler も同様の機能を提供します。
  • 解決策 2: シェル スクリプトと SQL を使用して当日の上流データの状態を判断し、空の場合は昨日の ODS レイヤー データを使用します。シェルスクリプトでSQL文を呼び出すのは面倒で、ハイブのkeberos認証を設定する必要があります。十分にエレガントではありません。
  • 解決策 3: HSQL を直接使用して、この IF ELSE 判定ロジックを実装します. 当日抽出した上流のテーブル データが空の場合は、昨日の ODS レイヤー データを取得します. このソリューションは、プラットフォームのスケジューリングと統合された keberos 認証を直接使用します。完璧ですが、そのようなロジックを実装するにはどうすればよいですか?

達成

DataX によって抽出された ODS レイヤー テーブルの名前が o_hcm.org_unit_record_stg である場合、ods レイヤー テーブルの名前は o_hcm.org_unit_record です。

  • 共通プログラム判定ロジック
if select count(1) from o_hcm.org_unit_record_stg == 0
select * from o_hcm.org_unit_record 
else 
select * from o_hcm.org_unit_record_stg 
  • SQL 実装
SELECT *
  FROM (
       SELECT COUNT(1) AS cnt FROM o_hcm.org_unit_record_stg
       ) t1
  INNER JOIN o_hcm.org_unit_record t2 ON t1.cnt =  0 -- 匹配 org_unit_record_stg 空时;

UNION ALL
SELECT * FROM o_hcm.org_unit_record_stg t1;  -- 匹配 org_unit_record_stg 不为空时;
;

org_unit_recordのデータをINNER JOINメソッドで取得します。

拡張思考

  • すべての IF ELSE パターンをユニオンオール + デカルト積/JOIN で構築できますか?

おすすめ

転載: blog.csdn.net/zdsx1104/article/details/128782570