
Fivetran の Row filtering を試してみた
はじめに
2025年2月のアップデートでユーザー定義の条件にマッチするレコードのみを同期対象とできる Row Filtering 機能が追加されました。また4月のアップデートでは、この機能でフィルタ時に使用できる Is NULL 構文や文字列比較の演算子も追加されています。
こちらの機能を試してみましたので、本記事で内容をまとめてみます。
機能概要
公式ドキュメントとしては以下に記載があります。
これまで Fivetran は ELT ツールとしてソース側のすべての履歴データを同期する仕様でしたが、行フィルタリングを使用することで、最近のデータのみなど、条件に合致する必要なレコードを宛先に同期できるようになります。
サポートされるデータ型
現在は、以下のデータ型で行フィルタがサポートされています。
- Integer
- Serial
- Date and Datetime/Timestamp
- String
サポートされる演算子は以下の記事をご参照ください。
サポートされるコネクタ
本機能を使用できるコネクタにはこちらに記載があります。代表的なデータベースコネクタ(MySQL・PostgreSQL・SQLServer)を中心に対応している印象です。
行フィルタの適用タイミング
行フィルタリングは、初期同期と再同期(Re-sync)実行時に適用されます。増分同期時は行フィルタリングはサポートされません。
主な制約
その他主な制約は以下の通りです。
- フィルターごとに最大 3 つの条件を作成できる
- テーブルごとにフィルターを 1 つだけ作成できる
詳細は以下をご参照ください。
試してみる
前提条件
以下の環境で検証しています。
- Destination:BigQuery
- ソース:Aurora MySQL
それぞれの設定手順は以下の記事をご参照ください。
サンプルテーブルを追加
MySQL 側で以下のコマンドを実行し検証用のテーブルを用意しました。
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_name VARCHAR(100),
category VARCHAR(50),
status ENUM('active', 'inactive', 'cancelled'),
event_date DATE,
location VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO events (event_name, category, status, event_date, location)
VALUES
('Music Festival', 'Entertainment', 'active', '2024-07-01', 'Tokyo'),
('Tech Conference', 'Technology', 'active', '2024-08-15', 'Osaka'),
('Yoga Class', 'Health', 'inactive', '2024-06-20', 'Nagoya'),
('Food Expo', 'Culinary', 'cancelled', '2024-09-10', 'Fukuoka'),
('Startup Pitch', 'Business', 'active', '2024-07-25', 'Tokyo');
> select * from events;
+----+-----------------+---------------+-----------+------------+----------+---------------------+
| id | event_name | category | status | event_date | location | created_at |
+----+-----------------+---------------+-----------+------------+----------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 |
| 3 | Yoga Class | Health | inactive | 2024-06-20 | Nagoya | 2025-05-17 02:48:04 |
| 4 | Food Expo | Culinary | cancelled | 2024-09-10 | Fukuoka | 2025-05-17 02:48:04 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 |
+----+-----------------+---------------+-----------+------------+----------+---------------------+
テーブル作成後、Fivetran 側で対象のコネクションのスキーマタブを更新すると、上記手順で追加したデータベースを確認できます。
フィルタを追加
上図の赤枠の「Filter data」をクリックすると図のようなメニューが表示されます。
- Column
- フィルタ可能なカラムを選択できます
- Operator
- 「Equal To」、「Is NULL」などフィルタで使用する演算子を指定することでフィルタリング条件を定義できます
[event_date] が「2024-07-01」以降を追加してみます。
この状態で「Save and Apply」をクリックし同期を開始します。
同期後 BigQuery 側を確認すると、条件に合致しないレコード(id=3)が除外される形で宛先にロードされました。
$ bq query --use_legacy_sql=false 'SELECT * FROM `testdb.events` ORDER BY 1'
+----+-----------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| id | event_name | category | status | event_date | location | created_at | _fivetran_deleted | _fivetran_synced |
+----+-----------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 4 | Food Expo | Culinary | cancelled | 2024-09-10 | Fukuoka | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
+----+-----------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
条件に合致するレコードを追加し増分同期を行います。
INSERT INTO events (event_name, category, status, event_date, location)
VALUES ('Summer Workshop', 'Education', 'active', '2024-10-15', 'Kyoto');
この場合、意図した通り宛先に追加されます。(※検証時に別レコードを追加、削除したので id が一つ抜けています)
$ bq query --use_legacy_sql=false 'SELECT * FROM `testdb.events` ORDER BY 1'
+----+-----------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| id | event_name | category | status | event_date | location | created_at | _fivetran_deleted | _fivetran_synced |
+----+-----------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 4 | Food Expo | Culinary | cancelled | 2024-09-10 | Fukuoka | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 7 | Summer Workshop | Education | active | 2024-10-15 | Kyoto | 2025-05-19 09:40:07 | false | 2025-05-19 09:41:00 |
+----+-----------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
続けて、フィルタで除外されるレコード([event_date] が 2024-07-01 より前)を追加してみます。
> INSERT INTO events (event_name, category, status, event_date, location)
VALUES ('Photography Exhibition', 'Arts', 'active', '2024-06-10', 'Yokohama');
> select * from events;
+----+------------------------+---------------+-----------+------------+----------+---------------------+
| id | event_name | category | status | event_date | location | created_at |
+----+------------------------+---------------+-----------+------------+----------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 |
| 3 | Yoga Class | Health | inactive | 2024-06-20 | Nagoya | 2025-05-17 02:48:04 |
| 4 | Food Expo | Culinary | cancelled | 2024-09-10 | Fukuoka | 2025-05-17 02:48:04 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 |
| 7 | Summer Workshop | Education | active | 2024-10-15 | Kyoto | 2025-05-19 09:40:07 |
| 8 | Photography Exhibition | Arts | active | 2024-06-10 | Yokohama | 2025-05-19 09:45:08 |
+----+------------------------+---------------+-----------+------------+----------+---------------------+
この状態で同期すると、このレコードはフィルタされず宛先に同期されます。これは仕様通りで、Row filterling は初期同期・再同期時のみ適用されるためです。
$ bq query --use_legacy_sql=false 'SELECT * FROM `testdb.events` ORDER BY 1'
+----+------------------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| id | event_name | category | status | event_date | location | created_at | _fivetran_deleted | _fivetran_synced |
+----+------------------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 4 | Food Expo | Culinary | cancelled | 2024-09-10 | Fukuoka | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:30:07 |
| 7 | Summer Workshop | Education | active | 2024-10-15 | Kyoto | 2025-05-19 09:40:07 | false | 2025-05-19 09:41:00 |
| 8 | Photography Exhibition | Arts | active | 2024-06-10 | Yokohama | 2025-05-19 09:45:08 | false | 2025-05-19 09:46:01 |
+----+------------------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
条件をさらに追加
さらにフィルタを追加してみます。スキーマタブから対象の「Filtered > View filter」をクリックすると既存のフィルタを表示できるので、「And」をクリックすると追加のフィルタ条件を設定できます。
ここでは下図のように [status] が「active」のレコードを同期対象とするフィルタ条件を指定しました。
「Save and Apply」をクリックすると、先と同じように下図のポップアップが表示されました。すでに一度同期しているので再同期が実行されるというメッセージです。
問題ないので「Apply filter and re-sync」をクリックします。
再同期後、BigQuery でテーブルを確認すると、以下のようになっていました。
$ bq query --use_legacy_sql=false 'SELECT * FROM `testdb.events` ORDER BY 1'
+----+------------------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| id | event_name | category | status | event_date | location | created_at | _fivetran_deleted | _fivetran_synced |
+----+------------------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:48:29 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 | false | 2025-05-19 09:48:29 |
| 4 | Food Expo | Culinary | cancelled | 2024-09-10 | Fukuoka | 2025-05-17 02:48:04 | true | 2025-05-19 09:30:07 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:48:29 |
| 7 | Summer Workshop | Education | active | 2024-10-15 | Kyoto | 2025-05-19 09:40:07 | false | 2025-05-19 09:48:29 |
| 8 | Photography Exhibition | Arts | active | 2024-06-10 | Yokohama | 2025-05-19 09:45:08 | true | 2025-05-19 09:46:01 |
+----+------------------------+---------------+-----------+------------+----------+---------------------+-------------------+---------------------+
ここでは宛先テーブルを削除していませんでした。この場合、Fivetran でレコードそのものは削除されない仕様のため、条件に合致しないレコードは論理削除される形で反映されていました。
最後に、BigQuery 側で宛先テーブルを一度削除し、同じフィルタ条件を設定した状態で再同期します。
同期されたテーブルを確認すると、条件に合わないレコードは宛先に同期されず、テーブルが作成されました。
$ bq query --use_legacy_sql=false 'SELECT * FROM `testdb.events` ORDER BY 1'
+----+-----------------+---------------+--------+------------+----------+---------------------+-------------------+---------------------+
| id | event_name | category | status | event_date | location | created_at | _fivetran_deleted | _fivetran_synced |
+----+-----------------+---------------+--------+------------+----------+---------------------+-------------------+---------------------+
| 1 | Music Festival | Entertainment | active | 2024-07-01 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:51:38 |
| 2 | Tech Conference | Technology | active | 2024-08-15 | Osaka | 2025-05-17 02:48:04 | false | 2025-05-19 09:51:38 |
| 5 | Startup Pitch | Business | active | 2024-07-25 | Tokyo | 2025-05-17 02:48:04 | false | 2025-05-19 09:51:38 |
| 7 | Summer Workshop | Education | active | 2024-10-15 | Kyoto | 2025-05-19 09:40:07 | false | 2025-05-19 09:51:38 |
+----+-----------------+---------------+--------+------------+----------+---------------------+-------------------+---------------------+
さいごに
Fivetran の Row filtering を試してみました。
初期同期・再同期時にフィルタが実行され、この際除外されたレコードは以降の同期からも無視されます。注意点として、増分同期時はフィルタが適用されないので、初期同期以降にフィルタに合致しないレコードが追加されるような場合は、宛先に同期されます。
ボリュームが多く、十分古いなどで分析に使用しないレコードの日時カラム等でフィルタとして使用することで、DWH 側のストレージコストやクエリの負荷を下げるというのが一つユースケースとしてあり得るかと思いました。
こちらの内容が何かの参考になれば幸いです。