Basic Filters
Maxwell can be configured to filter out updates from specific tables. This is controlled
by the --filter
command line flag.
Example 1
--filter = 'exclude: foodb.*, include: foodb.tbl, include: foodb./table_\d+/'
This example tells Maxwell to suppress all updates that happen on foodb
, except for updates
to tbl
and any table in foodb matching the regexp /table_\d+/
.
Example 2
Filter options are evaluated in the order specified, so in this example we
suppress everything except updates in the db1
database.
--filter = 'exclude: *.*, include: db1.*'
Column Filters
Maxwell can also include/exclude based on column values:
--filter = 'exclude: db.tbl.col = reject'
will reject any row in db.tbl
that contains col
and where the stringified value of "col" is "reject".
Column filters are ignored if the specified column is not present, so --filter = 'exclude: *.*.col_a = *'
will exclude updates to any table that contains col_a
, but include every other table.
Blacklisting
In rare cases, you may wish to tell Maxwell to completely ignore a database or table, including schema changes. In general, don't use this. If you must use this:
--filter = 'blacklist: bad_db.*'
Note that once Maxwell has been running with a table or database marked as blacklisted, you must continue to run Maxwell with that table or database blacklisted or else Maxwell will halt. If you want to stop blacklisting a table or database, you will have to drop the maxwell schema first. Also note that this is the feature I most regret writing.
Javascript Filters
If you need more flexibility than the native filters provide, you can write a small chunk of
javascript for Maxwell to pass each row through with --javascript FILE
. This file should contain
at least a javascript function named process_row
. This function will be passed a WrappedRowMap
object that represents the current row and a LinkedHashMap<String, Object>
which represents a global state and is free to make filtering and data munging decisions:
function process_row(row, state) {
// Updating the state object
if ( row.database == "test" && row.table == "lock") {
var haslock = row.data.get("haslock");
if ( haslock == "false" ) {
state.put("haslock", "false");
} else if( haslock == "true" ) {
state.put("haslock", "true");
}
}
// Suppressing rows based on state
if(state.get("haslock") == "true") {
row.suppress();
}
// Filter and Change based on actual data
if ( row.database == "test" && row.table == "bar" ) {
var username = row.data.get("username");
if ( username == "osheroff" )
row.suppress();
row.data.put("username", username.toUpperCase());
}
}
There's a longer example here: https://github.com/zendesk/maxwell/blob/master/src/example/filter.js.