Fivetran の Row filtering を試してみた

Fivetran の Row filtering を試してみた

Clock Icon2025.05.20

はじめに

2025年2月のアップデートでユーザー定義の条件にマッチするレコードのみを同期対象とできる Row Filtering 機能が追加されました。また4月のアップデートでは、この機能でフィルタ時に使用できる Is NULL 構文や文字列比較の演算子も追加されています。

https://fivetran.com/docs/changelog/2025/february-2025#rowfiltering

こちらの機能を試してみましたので、本記事で内容をまとめてみます。

機能概要

公式ドキュメントとしては以下に記載があります。

https://fivetran.com/docs/using-fivetran/features/row-filter

これまで Fivetran は ELT ツールとしてソース側のすべての履歴データを同期する仕様でしたが、行フィルタリングを使用することで、最近のデータのみなど、条件に合致する必要なレコードを宛先に同期できるようになります。

サポートされるデータ型

現在は、以下のデータ型で行フィルタがサポートされています。

  • Integer
  • Serial
  • Date and Datetime/Timestamp
  • String

サポートされる演算子は以下の記事をご参照ください。

https://fivetran.com/docs/using-fivetran/features/row-filter#supportedoperators

サポートされるコネクタ

本機能を使用できるコネクタにはこちらに記載があります。代表的なデータベースコネクタ(MySQL・PostgreSQL・SQLServer)を中心に対応している印象です。

行フィルタの適用タイミング

行フィルタリングは、初期同期再同期(Re-sync)実行時に適用されます。増分同期時は行フィルタリングはサポートされません

主な制約

その他主な制約は以下の通りです。

  • フィルターごとに最大 3 つの条件を作成できる
  • テーブルごとにフィルターを 1 つだけ作成できる

詳細は以下をご参照ください。

https://fivetran.com/docs/using-fivetran/features/row-filter#limitations

試してみる

前提条件

以下の環境で検証しています。

  • Destination:BigQuery
  • ソース:Aurora MySQL

それぞれの設定手順は以下の記事をご参照ください。

https://dev.classmethod.jp/articles/fivetran-set-bigquery-as-destination-202505/

https://dev.classmethod.jp/articles/fivetran-aurora-mysql-bigquery-202505/

サンプルテーブルを追加

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 側で対象のコネクションのスキーマタブを更新すると、上記手順で追加したデータベースを確認できます。

image

フィルタを追加

上図の赤枠の「Filter data」をクリックすると図のようなメニューが表示されます。

image 1

  • Column
    • フィルタ可能なカラムを選択できます
  • Operator

[event_date] が「2024-07-01」以降を追加してみます。

image 2

この状態で「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」のレコードを同期対象とするフィルタ条件を指定しました。

image 3

「Save and Apply」をクリックすると、先と同じように下図のポップアップが表示されました。すでに一度同期しているので再同期が実行されるというメッセージです。

問題ないので「Apply filter and re-sync」をクリックします。

image 4

再同期後、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 側のストレージコストやクエリの負荷を下げるというのが一つユースケースとしてあり得るかと思いました。
こちらの内容が何かの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.