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

Iceberg Definitive Guide輪読会 Chapter9

tanisushi
November 11, 2024

Iceberg Definitive Guide輪読会 Chapter9

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');