Add new fields to a key
By default, RDI adds fields to
hash or
JSON objects in the target
database that match the columns of the source table.
The examples below show how to add extra fields to the target data with the
add_field
transformation.
Add a single field
The first example adds a single field to the data.
The source
section selects the customer
table of the
chinook
database (the optional db
value here corresponds to the
sources.<source-name>.connection.database
value defined in
config.yaml
).
In the transform
section, the add_field
transformation adds an extra field called localphone
to the object, which is created by removing the country and area code from the phone
field with the
JMESPath function regex_replace()
.
You can also specify sql
as the language
if you prefer to create the new
field with an SQL expression.
The output
section specifies hash
as the data_type
to write to the target, which
overrides the default setting of target_data_type
defined in config.yaml
. Also, the
output.with.key
section specifies a custom key format of the form cust:<id>
where
the id
part is generated by the uuid()
function.
The full example is shown below:
source:
db: chinook
table: customer
transform:
- uses: add_field
with:
expression: regex_replace(phone, '\+[0-9]+ (\([0-9]+\) )?', '')
field: localphone
language: jmespath
output:
- uses: redis.write
with:
connection: target
data_type: hash
key:
expression: concat(['cust:', uuid()])
language: jmespath
If you queried the generated target data from the default transformation
using redis-cli
, you would
see something like the following:
1) "customerid"
2) "27"
3) "firstname"
4) "Patrick"
5) "lastname"
6) "Gray"
.
.
17) "phone"
18) "+1 (520) 622-4200"
.
.
Using the job file above, the data also includes the new localphone
field:
1) "customerid"
2) "27"
3) "firstname"
4) "Patrick"
5) "lastname"
6) "Gray"
.
.
23) "localphone"
24) "622-4200"
Add multiple fields
The add_field
transformation can also add multiple fields at the same time
if you specify them under a fields
subsection. The example below adds two
fields to the track
objects. The first new field, seconds
, is created using a SQL
expression to calculate the duration of the track in seconds from the
milliseconds
field.
The second new field, composerlist
, adds a JSON array using the split()
function
to split the composer
string field wherever it contains a comma.
source:
db: chinook
table: track
transform:
- uses: add_field
with:
fields:
- expression: floor(milliseconds / 1000)
field: seconds
language: sql
- expression: split(composer)
field: composerlist
language: jmespath
output:
- uses: redis.write
with:
connection: target
data_type: json
key:
expression: concat(['track:', trackid])
language: jmespath
You can query the target database to see the new fields in the JSON object:
> JSON.GET track:1 $
"[{\"trackid\":1,\"name\":\"For Those About To Rock (We Salute You)\",\"albumid\":1,\"mediatypeid\":1,\"genreid\":1,\"composer\":\"Angus Young, Malcolm Young, Brian Johnson\",\"milliseconds\":343719,\"bytes\":11170334,\"unitprice\":\"0.99\",\"seconds\":343,\"composerlist\":[\"Angus Young\",\" Malcolm Young\",\" Brian Johnson\"]}]"
Using add_field
with remove_field
You can use the add_field
and
remove_field
transformations together to completely replace fields from the source. For example,
if you add a new fullname
field, you might not need the separate firstname
and
lastname
fields. You can remove them with a job file like the following:
source:
db: chinook
table: customer
transform:
- uses: add_field
with:
expression: concat(firstname, ' ', lastname)
field: fullname
language: sql
- uses: remove_field
with:
fields:
- field: firstname
- field: lastname
output:
- uses: redis.write
with:
connection: target
data_type: hash
key:
expression: concat(['cust:', customerid])
language: jmespath