Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Iceberg Definitive Guide輪読会 Chapter9

Avatar for tanisushi tanisushi
November 11, 2024

Iceberg Definitive Guide輪読会 Chapter9

Avatar for tanisushi

tanisushi

November 11, 2024
Tweet

More Decks by tanisushi

Other Decks in Technology

Transcript

  1. なぜFlinkとIcebergを一緒に使うのか 
 ストリーミングデータに対して様々な恩恵を得られるから 
 • トランザクションの一貫性を保証 
 • スキーマエボリューションが容易になる 


    • ログ生成からのレイテンシの向上 
 • 従来システムからの簡略化
 • インクリメンタルなデータ読み込みによる処理の高速化 
 参考:LINEがログパイプラインにFlink+Icebergを採用している事例 
 
 

  2. ALTER TABLE 
 テーブルプロパティを変更したい時も特殊な操作は必要ない
 ALTER TABLE employee SET ('write.format.default'='avro'); ALTER

    TABLE employee RENAME TO emp_new; テーブル名の変更
 テーブルの書き込みフォーマットの変更 

  3. メタデータに対するアクセス 
 主要なメタデータに対するアクセスは以下の通り
 
 
 
 
 
 
                      ※その他のメタデータに対するアクセスはリンクを参照inspecting-tables


    SELECT * FROM `catalog`.`database`.`table`$history; テーブル履歴へのアクセス 
 メタデータファイル履歴へのアクセス 
 スナップショットへのアクセス 
 SELECT * FROM `catalog`.`database`.`table`$metadata_log_entries; SELECT * FROM `catalog`.`database`.`table`$snapshots;
  4. INSERT INTO 
 特別な処理は必要なく一般的なクエリでデータを挿入することができる
 バッチ処理、ストリーミング処理どちらでも実行可能
 INSERT INTO employee VALUES (1,

    'Software Engineer', 'Engineering', 25000, 'NA'); 値を指定して挿入するケース 
 他テーブルから値を挿入するケース 
 INSERT INTO employee SELECT id, role from emp_new;
  5. INSERT OVERWRITE 
 既にテーブルにあるデータを書き換えたいときに使用する
 IcebergのAtomicな操作のおかげでこのようなクエリを実行しても
 データの一貫性を保つことが可能
 (※バッチモードのみ対応)
 
 INSERT OVERWRITE

    employee VALUES (1, 'Software Tester', 'Engineering', 23000,'NA'); 指定された行を全て指定の値で上書きする 
 INSERT OVERWRITE employee PARTITION(department='Engineering') SELECT * FROM updated_emp_data WHERE department='Engineering'; 指定されたパーティション値のみを上書きする 

  6. UPSERT 
 INSERTとUPDATEの組み合わせで以下のような挙動をする 
 (SparkやDremioのMERGE INTOと同じような操作) 
 • レコードがある場合→更新
 •

    レコードがない場合→新しいレコードを挿入 
 実行のためにはテーブルが以下の条件が満たされている必要がある 
 • テーブルスキーマでプライマリキーが指定されている 
 

  7. UPSERT INTOの実例 
 UPSERTその1(テーブル作成時にオプション指定) 
 
 CREATE TABLE employee (

    `id` INT UNIQUE, `role` STRING NOT NULL, `department` STRING NOT NULL, `salary` FLOAT, `region` STRING NOT NULL, PRIMARY KEY(`id`) NOT ENFORCED ) WITH ('format-version'='2', 'write.upsert.enabled'='true'); INSERT INTO employee VALUES (1, 'Director', 'Product', 33000, 'APAC'); UPSERTその2(INSERT操作の時にオプション指定) 
 INSERT INTO employee /*+ OPTIONS('upsert-enabled'='true') */ VALUES (3, 'Manager', 'Engineering', 26000, 'NA');