はじめに
地域の会場は、確定済みの来場記録を Hive アーカイブに保存しています。承認された修正は、ある日付の確定済みレコード全体を置き換えます。昨日の行に追加する差分ではありません。ある承認日には新しく確定した記録が2件あり、別の承認日には確定済み記録がありません。後から追加された来場記録を含め、ほかの日付はすべて変更せずに保持する必要があります。
練習専用テーブルで追記と置き換えを比較してから、対象を厳密に限定した SQL ファイルを保存し、実際の ORC アーカイブに対して実行します。同じファイルを再実行し、結果をもう一度読み取ります。環境では Hive と HDFS が稼働しており、独立した元レコード、修正候補、アーカイブが用意されています。
Hive の外部テーブル、WHERE を使う SELECT、パーティション列、ORC、基本的な HDFS パスを理解していることが前提です。このラボでは、静的な書き込み先パーティションと1日分全体の置き換えを学びます。すべての操作は Terminal タブで行います。65分は、読解と通常の入力ミスへの対応を含む作者の見積もりです。
追記と置き換えを安全に比較する
このステップでは通常のアーカイブ日を読み取り、練習専用テーブルで3つの書き込み範囲を比較します。比較中は実際のアーカイブを変更しないでください。
Terminal を開きます。ラボ全体で、用意された作業ディレクトリを使用します。
cd /home/labex/project
ローカルの venue ディレクトリには、参照用 CSV と承認リストがあります。cat はファイルを編集せずに内容を表示します。
cat venue/approved-days.txt
2026-10-02
2026-10-03
実際のアーカイブで置き換えが許されるのは、この2つの日付だけです。まず通常の日付を読み取ります。Beeline は SQL を HiveServer2 に送ります。次のコマンドでは、-u が JDBC 接続先、-n labex がクライアントのユーザー名、-e が SQL テキストを指定します。ダブルクォートでテキストを1つのシェル引数にまとめ、内側のシングルクォートで SQL の値を区切ります。DATE '...' は日付型を明示します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT * FROM venue_archive.archive WHERE visit_date=DATE '2026-10-04' ORDER BY visit_id;"
起動時のメッセージの下にあるデータ行を読みます。この日には v4 / Music / 4 と v5 / LateWalk / 2 があります。後から追加された v5 は有効なので保持します。イメージが複数のログバインディングに関する SLF4J の通知を表示する場合がありますが、SQL エラーとは別のものです。プロンプトに戻るまで待ってから次へ進んでください。
次に、取り消されたレコードも含め、候補ソース全体を調べます。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT * FROM venue_archive.candidate ORDER BY visit_date,visit_id;"
10月2日には c21 / PrintWorkshop / 5 と c22 / Bookbinding / 2 があり、どちらも confirmed です。10月3日には cancelled の行があります。アーカイブは confirmed の行だけを保存するため、10月3日の正当な置き換え集合は空になります。フィルタ後の結果に日付が現れなくても、その日付の古いアーカイブを残すという意味ではありません。承認範囲と確定済み行のフィルタは、別々の判断です。
3つの実際のテーブルがどこを読み書きするか確認します。DESCRIBE FORMATTED は列定義に加えてストレージメタデータを表示します。各結果で Table Type、Location、InputFormat を探してください。長い出力にはエンジンの詳細も含まれますが、書き込み前はこれらの項目に注目します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "DESCRIBE FORMATTED venue_archive.raw; DESCRIBE FORMATTED venue_archive.candidate; DESCRIBE FORMATTED venue_archive.archive;"
3つとも EXTERNAL_TABLE オブジェクトです。元データの場所は hdfs://localhost:9000/user/labex/venue-archive/raw、候補の場所は末尾が /user/labex/venue-archive/candidate のパスです。どちらもテキスト入力を使います。アーカイブの場所は hdfs://localhost:9000/warehouse/external/venue_archive.db/archive で、入力形式の末尾は OrcInputFormat です。ローカルの venue/*.csv は参照コピーであり、アーカイブではありません。提供された対応関係とソースファイルを保持してください。
実際のアーカイブを変更する前に、2つの練習専用テーブルを使います。practice_days は日付でパーティション分割され、practice_whole は日付を通常の列として保存します。初期状態は元データの確定済み来場記録です。次のコマンドでは、この練習テーブルだけで意図的に誤った結果を確認します。
INSERT INTO は行を追記します。PARTITION(visit_date='2026-10-02') は静的な書き込み先パーティションです。リテラルの日付が、選ばれたすべての行の書き込み先を決めます。そのため、SELECT はパーティション列以外の3列だけを返す必要があります。別の WHERE 条件がソース行を選びます。書き込み先を指定しても、ソースは自動で絞り込まれません。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT INTO TABLE venue_archive.practice_days PARTITION(visit_date='2026-10-02') SELECT visit_id,activity,visitors FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed'; SELECT * FROM venue_archive.practice_days WHERE visit_date=DATE '2026-10-02' ORDER BY visit_id;"
結果には c21、c22 に加えて古い v2 があります。SQL は成功しましたが、置き換えの契約は満たしていません。同じ修正を再び追記すると、さらに重複行が増えます。
INSERT OVERWRITE は書き込み先の既存行を置き換えます。非パーティションテーブル practice_whole では、書き込み先はテーブル全体です。ほかの日付が消える様子を確認します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT OVERWRITE TABLE venue_archive.practice_whole SELECT visit_id,activity,visitors,visit_date FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed'; SELECT * FROM venue_archive.practice_whole ORDER BY visit_date,visit_id;"
10月2日の2行だけが残ります。テーブル全体への書き込みが成功しても、無関係な日付を失うことがあります。この練習テーブルを、完全な元データから復元します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT OVERWRITE TABLE venue_archive.practice_whole SELECT visit_id,activity,visitors,visit_date FROM venue_archive.raw WHERE record_status='confirmed'; SELECT * FROM venue_archive.practice_whole ORDER BY visit_date,visit_id;"
元の5行がすべて戻ります。最後に、practice_days で OVERWRITE と静的な日付パーティションを組み合わせます。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "INSERT OVERWRITE TABLE venue_archive.practice_days PARTITION(visit_date='2026-10-02') SELECT visit_id,activity,visitors FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed'; SELECT * FROM venue_archive.practice_days ORDER BY visit_date,visit_id;"
結果は6行です。元の10月1日、修正後の10月2日の2行、元の10月3日、10月4日の2件が残ります。古い v2 はなくなりました。これが実際のアーカイブに必要な書き込み範囲です。
Beeline が無効なテーブル名を報告した場合、SQL は目的のオブジェクトを見つけていません。次の既習の読み取りコマンドで綴りを確認し、修正したコマンドを再実行してください。パスの問題は pwd と ls venue で確認し、上の cd で作業ディレクトリへ戻れます。入力ミスを直すためにテーブルを作り直したり、環境の初期化を再実行したりしないでください。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SHOW TABLES IN venue_archive;"
このステップをチェックする前に、練習パーティションの10月2日がちょうど c21 と c22 であること、テーブル全体の練習が元の5行へ戻っていること、実際のアーカイブが元データのままであることを確認します。
確定済みレコードがある承認日のデータを置き換える
このステップでは、実際の10月2日の置き換えを保存して実行します。Terminal の /home/labex/project で続けます。
実際の venue_archive.archive は、visit_date DATE でパーティション分割された、トランザクションを使用しない外部 ORC テーブルです。元データと候補は、それぞれ独立したカンマ区切りテキストの外部テーブルです。置き換えられるのは承認されたアーカイブ日付だけです。ソースファイル、テーブル定義や場所、パーティションの対応先を変更したり、追加の日付を作成したり、アーカイブ全体を再構築したりしてはいけません。10月1日と4日は、元データと既存の HDFS ファイルを保持する必要があります。同じ行を書き直すだけでも承認範囲外です。
書き込む前に、実際のパーティション一覧と列構成を確認します。SHOW PARTITIONS は登録済みの日付パーティションを列挙し、DESCRIBE は通常の列に続いてパーティション情報を表示します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SHOW PARTITIONS venue_archive.archive; DESCRIBE venue_archive.archive;"
4つの日付は10月1日から4日です。通常の列は visit_id STRING、activity STRING、visitors INT で、visit_date DATE がパーティション列です。この対応関係と ORC 形式を保持してください。
SQL を編集できるファイルとして保存すると、同じ操作を確認、修正、再実行できます。nano は Terminal 内のテキストエディターです。次のコマンドは、現在の作業ディレクトリで replace-approved-days.sql を開きます。新しいファイルなので、最初の編集領域は空です。
nano replace-approved-days.sql
次の SQL 5 行を、シェルプロンプトではなく nano 内に入力します。シングルクォートは SQL の値を区切り、セミコロンは文を終了します。最後のセミコロンのところで止め、余分な空行は追加しないでください。nano が保存時に末尾の改行を補います。
INSERT OVERWRITE TABLE venue_archive.archive
PARTITION(visit_date='2026-10-02')
SELECT visit_id,activity,visitors
FROM venue_archive.candidate
WHERE visit_date=DATE '2026-10-02' AND record_status='confirmed';
矢印キーで修正する文字へ移動します。Home と End は、現在の行の先頭と末尾へ移動します。Backspace はカーソルの左側の文字を、Delete はカーソル位置の文字を削除します。その位置に正しいテキストを入力してください。nano のフッターでは ^ が Ctrl を意味します。Ctrl+O で保存します。File Name to Write では表示されたファイル名を保ち、Enter を押します。次に Ctrl+X で終了します。シェルプロンプトに戻るまで待ってください。SQL はエディター内に入力し、次のコマンドはそのプロンプトで実行します。
実行前に保存内容を読みます。
cat replace-approved-days.sql
文中の2つの日付を確認します。静的な書き込み先もソースのフィルタも10月2日です。修正は c21 と c22 の両方を含む確定済みレコードの完全な集合です。古い訪問 ID に照合したり、1行ずつ更新したりする必要はありません。
Beeline の -f はファイルから SQL を読みます。保存したファイルを実行します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -f replace-approved-days.sql
続いて、データの利用者と同じように4日分をすべて読みます。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT visit_date,visit_id,activity,visitors FROM venue_archive.archive ORDER BY visit_date,visit_id;"
6行になるはずです。10月2日には c21 / PrintWorkshop / 5 と c22 / Bookbinding / 2 があり、v2 はありません。10月3日にはまだ古い v3 が残っています。10月1日の v1 と、10月4日の v4、v5 は変わりません。
Beeline 接続では、クライアントは labex として識別されます。HiveServer2 はサービスユーザー hive でストレージへ書き込むため、新しい ORC ファイルの所有者が hive:bigdata になる場合があります。所有者や権限を変更する必要はありません。HDFS の NameNode は独自のサービス ID hdfs で動作します。
SQL 文に構文エラーがある場合は、cat で保存ファイルを調べ、nano replace-approved-days.sql で開き直します。矢印キーで Beeline のエラーが示す文を探します。必要に応じてテーブル名、日付、引用符、セミコロンを修正し、ほかの SQL 行は残します。Ctrl+O、Enter で保存し、Ctrl+X で終了します。-f を再実行する前にファイルをもう一度読みます。この承認日に誤って追記した場合も、同じ正しいパーティション上書きで古い行や重複行を除去できます。この復旧は承認日だけに適用され、保護された日付の再構築は許可されません。
空のレコード集合で置き換え、同じファイルを再実行する
このステップでは、承認された10月3日のパーティションを空にし、完全な修正ファイルを2回実行して、行が増えないことを検証します。Terminal の /home/labex/project で続けます。
取り消しも修正の一種です。承認リストには10月3日がありますが、その候補に確定済みの来場記録はありません。まずソースの選択を実行します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT visit_id,activity,visitors FROM venue_archive.candidate WHERE visit_date=DATE '2026-10-03' AND record_status='confirmed';"
データ行は返りません。正しい最終アーカイブでも、この日付は0行でなければなりません。書き込みを省くと古い v3 が残ります。
同じファイルを開き直します。既存の10月2日の文を残し、最初の文を再びコピーせず、文を1つ追加します。
nano replace-approved-days.sql
下矢印キーで最初の文のセミコロンの後の空行へ移動します。行末へ移動する必要があれば End を使います。その空行で Enter を1回押し、文の間に空行を1つ残します。続いて、以下の新しい5行だけを入力します。最後のセミコロンで止め、余分な空行は追加しません。中断した編集を再開する場合は、まず10月3日の文がすでにあるか確認し、重複して追加せず修正してください。
INSERT OVERWRITE TABLE venue_archive.archive
PARTITION(visit_date='2026-10-03')
SELECT visit_id,activity,visitors
FROM venue_archive.candidate
WHERE visit_date=DATE '2026-10-03' AND record_status='confirmed';
Ctrl+O、Enter で保存し、Ctrl+X で終了します。シェルプロンプトで、保存したファイル全体を読みます。
cat replace-approved-days.sql
元の10月2日の文に新しい10月3日の文が続き、文がちょうど2つあることを確認します。各文で、静的な書き込み先とソースのフィルタの両方が、その文の承認日を指定していなければなりません。誤りがあれば、nano で同じファイルを開き直し、該当する行だけを直してから、保存してもう一度確認します。
この完全な保存ファイルを最初に実行します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -f replace-approved-days.sql
選択結果が空の静的な上書きは、書き込み先パーティションの古い行を除去します。日付のパーティション登録は残ります。空のパーティションに物理ファイルがあるかどうかはストレージエンジンが決めます。CSV や ORC の空の代替ファイルを自分で作らないでください。
登録済みの日付と完全な結果を読みます。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SHOW PARTITIONS venue_archive.archive; SELECT visit_date,visit_id,activity,visitors FROM venue_archive.archive ORDER BY visit_date,visit_id; SELECT COUNT(*) FROM venue_archive.archive WHERE visit_date=DATE '2026-10-03';"
4つのパーティションがすべて列挙されます。結果全体は v1、c21、c22、v4、v5 の5行です。10月3日の件数は 0 です。2日分の承認があっても、両方のパーティションにレコードが必要とは限りません。
ファイルを変更せず、同じ保存ファイルをもう一度実行します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -f replace-approved-days.sql
利用者向けの読み取りを繰り返します。
beeline -u jdbc:hive2://localhost:10000/default -n labex -e "SELECT visit_date,visit_id,activity,visitors FROM venue_archive.archive ORDER BY visit_date,visit_id; SELECT COUNT(*) FROM venue_archive.archive;"
同じ5行が残り、合計は 5 です。これは提供されたソースに対して再実行可能な置き換えであり、重複行を追記しません。再実行すると承認済みパーティションのファイルは作り直されることがありますが、対象外の日付の元ファイルはそのまま保持する必要があります。
既習の HDFS コマンドで元データを確認できます。ここでの -cat は指定したソースファイルを読み、派生した ORC アーカイブは読みません。
hdfs dfs -cat /user/labex/venue-archive/raw/raw.csv
元の v2 と v3 が今も含まれています。派生アーカイブを変更しても、元の履歴は書き換わりません。候補と承認リストも提供時のまま保持してください。SQL ファイルは作業ディレクトリに残します。チェックは現在の Hive データ、定義、範囲、保護ファイルを観察し、任意の保存 SQL を実行しません。実際の再実行と結果の読み取りが、保存した操作のセルフチェックです。
まとめ
追記、テーブル全体の置き換え、静的パーティションの置き換えを比較しました。その後、承認された1日分全体を置き換え、正当な空集合への置き換えを適用し、同じ保存 SQL を再実行しても行が増えないことを確認しました。独立した元の履歴と、ほかの日付のアーカイブは保たれました。



