この記事は何
QiitaではTreasure workflowを使って一部データの加工などを行っています。
Treasure workflowを使う中で、ちょっとハマるポイントがあったので記事にしました。
Treasure workflowとは
Treasure workflowとはTreasure Data上で処理をワークフローとして定義、実行したいときに使うことができる機能です。
digdagをベースに作られています。
この機能を使うことで、データの加工、保存などをワークフローとして定義することができ、必要な処理をスケジュール毎やボタンひとつで実行することができます。
使用するクエリエンジンなどもスクリプト上で定義することが可能です。
_export:
engine: hive
engine_version: stable
td:
database: test
+users:
td>: users.sql
create_table: users
Treasure workflowにはcreate_table
というコマンドがあります。このコマンドを利用すると、実行した処理の結果を、指定したテーブルに保存することができます。
+users:
td>: users.sql
create_table: users
create_table
のはまりポイント
create_table
は前項で説明した通りシンプルな処理なのですが、create_table
は、すでにテーブルが存在した時は上書きの処理が走ります。
この処理が指定するクエリエンジンによって異なるのです。
クエリエンジンがPrestoの場合
クエリエンジンにPrestoを指定した場合は、create_table
コマンドを指定しているとDROP TABLE IF EXISTS
が実行されます。
つまりテーブルごと削除した後に、再度CREATE TABLE
の処理が走ることで、データの上書きを行なっています。
クエリエンジンがHiveの場合
クエリエンジンにHiveを指定した場合は、create_table
コマンドを指定しているとINSERT OVERWRITE
が実行されます。
つまりテーブルは残したまま、文字通りデータの上書きを行なっています。
何が困るのか
create_table
の処理がクエリエンジンごとでどのような処理になるかは前項で説明しました。
この違いで主に困るのはPrestoの方です。
Prestoは上書きではなくテーブルの作り直しをしています。
それにより、Treasure Data上でテーブルに対して何か変更(カラムの説明)を加えても、実行するたびに全て消えてしまいます。
この特性を知らないでいると、準備したものが全てパーにもなり得るので注意してください。
消えてほしくない場合はクエリエンジンにHiveを指定するようにしましょう。
参考文献