Hive ウェアハウスでは、特に頻繁に大規模なデータ更新が行われる場合、中央テーブルで最新のデータを維持することが重要です。更新情報。この課題に取り組むには、主に 2 つのアプローチがあります。
この方法は、メイン テーブルから古いエントリを特定して削除し、新しい増分エントリを挿入することを目的としています。データ。挿入は効率的ですが、削除プロセスには時間がかかることがあります。
Hive UPDATE ステートメントを使用すると、一致するキーに基づいて既存のエントリを変更できます。価値観。ただし、このアプローチには、各エントリを個別に更新する必要があるため、処理が遅くなる可能性があるという欠点があります。
パフォーマンスを向上させるには、より効率的な代替手段を使用します。インクリメント データとメイン テーブル間の FULL OUTER JOIN:
insert overwrite target_data [partition() if applicable] SELECT --select new if exists, old if not exists case when i.PK is not null then i.PK else t.PK end as PK, case when i.PK is not null then i.COL1 else t.COL1 end as COL1, ... case when i.PK is not null then i.COL_n else t.COL_n end as COL_n FROM target_data t --restrict partitions if applicable FULL JOIN increment_data i on (t.PK=i.PK);
ターゲット データを分割し、パーティションを使用することによって
すべての列を新しいデータで更新する必要がある場合は、結合操作をさらに最適化して、影響を受けるパーティションのみに焦点を当てることができます。 UNION ALL と行番号付けを使用でき、FULL OUTER JOIN メソッドよりも高速です。
SELECT PK, COL1, ... COL_n, row_number() OVER (PARTITION BY PK ORDER BY PK) as rownum FROM ( SELECT * FROM target_data UNION ALL SELECT * FROM increment_data ) GROUP BY PK, COL1, ..., COL_n
この手法では、結合された結果セット内の各行に一意の行番号を付けることで、更新する必要がある行を識別できます:
DELETE FROM target_data WHERE EXISTS ( SELECT 1 FROM combined_data WHERE combined_data.PK = target_data.PK AND combined_data.rownum > 1 )
INSERT OVERWRITE INTO target_data SELECT * FROM combined_data WHERE combined_data.rownum = 1
これらの最適化された手法を採用すると、Hive での増分更新のパフォーマンスが大幅に向上します。 、効率的なデータ管理と最新情報のタイムリーな利用可能性を確保します。
以上が頻繁に大規模な更新を行う場合、Hive メイン テーブルのデータを効率的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。