Ten new visible transforms in AWS Glue Studio

AWS Glue Studio is a graphical interface that makes it simple to create, run, and monitor extract, remodel, and cargo (ETL) jobs in AWS Glue. It lets you visually compose information transformation workflows utilizing nodes that characterize totally different information dealing with steps, which later are transformed mechanically into code to run.

AWS Glue Studio lately launched 10 extra visible transforms to permit creating extra superior jobs in a visible means with out coding expertise. On this publish, we focus on potential makes use of instances that mirror widespread ETL wants.

The brand new transforms that can be demonstrated on this publish are: Concatenate, Cut up String, Array To Columns, Add Present Timestamp, Pivot Rows To Columns, Unpivot Columns To Rows, Lookup, Explode Array Or Map Into Columns, Derived Column, and Autobalance Processing.

Resolution overview

On this use case, we have now some JSON recordsdata with inventory possibility operations. We need to make some transformations earlier than storing the information to make it simpler to investigate, and we additionally need to produce a separate dataset abstract.

On this dataset, every row represents a commerce of possibility contracts. Choices are monetary devices that present the suitable—however not the duty—to purchase or promote inventory shares at a set worth (referred to as  strike worth) earlier than an outlined expiration date.

Enter information

The information follows the next schema:

  • order_id – A singular ID
  • image – A code typically primarily based on a number of letters to determine the company that emits the underlying inventory shares
  • instrument – The identify that identifies the particular possibility being purchased or bought
  • foreign money – The ISO foreign money code through which the value is expressed
  • worth – The quantity that was paid for the acquisition of every possibility contract (on most exchanges, one contract lets you purchase or promote 100 inventory shares)
  • trade – The code of the trade middle or venue the place the choice was traded
  • bought – A listing of the variety of contracts that the place allotted to fill the promote order when this can be a promote commerce
  • purchased – A listing of the variety of contracts that the place allotted to fill the purchase order when that is purchase commerce

The next is a pattern of the artificial information generated for this publish:

{"order_id": 1679931512485, "image": "AMZN", "instrument": "AMZN MAR 24 23 102 PUT", "foreign money": "usd", "worth": 17.18, "trade": "EDGX", "purchased": [18, 38]}
{"order_id": 1679931512486, "image": "BMW.DE", "instrument": "BMW.DE MAR 24 23 96 PUT", "foreign money": "eur", "worth": 2.98, "trade": "XETR", "purchased": [28]}
{"order_id": 1679931512487, "image": "BMW.DE", "instrument": "BMW.DE APR 28 23 101 CALL", "foreign money": "eur", "worth": 14.71, "trade": "XETR", "bought": [9, 59, 54]}
{"order_id": 1679931512489, "image": "JPM", "instrument": "JPM JUN 30 23 140 CALL", "foreign money": "usd", "worth": 11.83, "trade": "EDGX", "purchased": [33, 42, 55, 67]}
{"order_id": 1679931512490, "image": "SIE.DE", "instrument": "SIE.DE MAR 24 23 149 CALL", "foreign money": "eur", "worth": 13.68, "trade": "XETR", "purchased": [96, 89, 82]}
{"order_id": 1679931512491, "image": "NKE", "instrument": "NKE MAR 24 23 112 CALL", "foreign money": "usd", "worth": 3.23, "trade": "EDGX", "bought": [67]}
{"order_id": 1679931512492, "image": "AMZN", "instrument": "AMZN MAY 26 23 95 CALL", "foreign money": "usd", "worth": 11.44, "trade": "EDGX", "bought": [41, 62, 12]}
{"order_id": 1679931512493, "image": "JPM", "instrument": "JPM MAR 24 23 121 PUT", "foreign money": "usd", "worth": 1.0, "trade": "EDGX", "purchased": [61, 34]}
{"order_id": 1679931512494, "image": "SAP.DE", "instrument": "SAP.DE MAR 24 23 132 CALL", "foreign money": "eur", "worth": 15.9, "trade": "XETR", "purchased": [69, 33]}

ETL necessities

This information has a variety of distinctive traits, as usually discovered on older techniques, that make the information tougher to make use of.

The next are the ETL necessities:

  • The instrument identify has invaluable data that’s supposed for people to know; we need to normalize it into separate columns for simpler evaluation.
  • The attributes purchased and bought are mutually unique; we will consolidate them right into a single column with the contract numbers and have one other column indicating if the contracts the place purchased or bought on this order.
  • We need to maintain the details about the person contract allocations however as particular person rows as an alternative of forcing customers to cope with an array of numbers. We may add up the numbers, however we might lose details about how the order was stuffed (indicating market liquidity). As a substitute, we select to denormalize the desk so every row has a single variety of contracts, splitting orders with a number of numbers into separate rows. In a compressed columnar format, the additional dataset measurement of this repetition is usually small when compression is utilized, so it’s acceptable to make the dataset simpler to question.
  • We need to generate a abstract desk of quantity for every possibility sort (name and put) for every inventory. This supplies a sign of the market sentiment for every inventory and the market normally (greed vs. worry).
  • To allow general commerce summaries, we need to present for every operation the grand whole and standardize the foreign money to US {dollars}, utilizing an approximate conversion reference.
  • We need to add the date when these transformations happened. This might be helpful, as an illustration, to have a reference on when was the foreign money conversion made.

Primarily based on these necessities, the job will produce two outputs:

  • A CSV file with a abstract of the variety of contracts for every image and kind
  • A catalog desk to maintain a historical past of the order, after doing the transformations indicated
    Data schema


You will want your individual S3 bucket to observe together with this use case. To create a brand new bucket, seek advice from Making a bucket.

Generate artificial information

To observe together with this publish (or experiment with this sort of information by yourself), you’ll be able to generate this dataset synthetically. The next Python script may be run on a Python surroundings with Boto3 put in and entry to Amazon Easy Storage Service (Amazon S3).

To generate the information, full the next steps:

  1. On AWS Glue Studio, create a brand new job with the choice Python shell script editor.
  2. Give the job a reputation and on the Job particulars tab, choose an appropriate position and a reputation for the Python script.
  3. Within the Job particulars part, broaden Superior properties and scroll all the way down to Job parameters.
  4. Enter a parameter named --bucket and assign as the worth the identify of the bucket you need to use to retailer the pattern information.
  5. Enter the next script into the AWS Glue shell editor:
    import argparse
    import boto3
    from datetime import datetime
    import io
    import json
    import random
    import sys
    # Configuration
    parser = argparse.ArgumentParser()
    args, ignore = parser.parse_known_args()
    if not args.bucket:
        elevate Exception("This script requires an argument --bucket with the worth specifying the S3 bucket the place to retailer the recordsdata generated")
    data_bucket = args.bucket
    data_path = "transformsblog/inputdata"
    samples_per_file = 1000
    # Create a single file with artificial information samples
    s3 = boto3.shopper('s3')
    buff = io.BytesIO()
    sample_stocks = [("AMZN", 95, "usd"), ("NKE", 120, "usd"), ("JPM", 130, "usd"), ("KO", 130, "usd"),
                     ("BMW.DE", 95, "eur"), ("SIE.DE", 140, "eur"), ("SAP.DE", 115, "eur")]
    option_type = ["PUT", "CALL"]
    operations = ["sold", "bought"]
    dates = ["MAR 24 23", "APR 28 23", "MAY 26 23", "JUN 30 23"]
    for i in vary(samples_per_file):
        inventory = random.alternative(sample_stocks)
        image = inventory[0]
        ref_price = inventory[1]
        foreign money = inventory[2]
        strike_price = spherical(ref_price * 0.9 + ref_price * random.uniform(0.01, 0.3))
        pattern = {
            "order_id": int(datetime.now().timestamp() * 1000) + i,
            "image": inventory[0],
            "instrument":f"{image} {random.alternative(dates)} {strike_price} {random.alternative(option_type)}",
            "foreign money": foreign money,
            "worth": spherical(random.uniform(0.5, 20.1), 2),
            "trade": "EDGX" if foreign money == "usd" else "XETR"
        pattern[random.choice(operations)] = [random.randrange(1,100) for i in range(random.randrange(1,5))]
    s3.put_object(Physique=buff.getvalue(), Bucket=data_bucket, Key=f"{data_path}/{int(datetime.now().timestamp())}.json")

  6. Run the job and wait till it exhibits as efficiently accomplished on the Runs tab (it ought to take just some seconds).

Every run will generate a JSON file with 1,000 rows underneath the bucket specified and prefix transformsblog/inputdata/. You may run the job a number of occasions if you wish to check with extra enter recordsdata.
Every line within the artificial information is a knowledge row representing a JSON object like the next:

 "instrument":"AMZN APR 28 23 100 PUT",
 "foreign money":"usd",

Create the AWS Glue visible job

To create the AWS Glue visible job, full the next steps:

  1. Go to AWS Glue Studio and create a job utilizing the choice Visible with a clean canvas.
  2. Edit Untitled job to present it a reputation and assign a task appropriate for AWS Glue on the Job particulars tab.
  3. Add an S3 information supply (you’ll be able to identify it JSON recordsdata supply) and enter the S3 URL underneath which the recordsdata are saved (for instance, s3://<your bucket identify>/transformsblog/inputdata/), then choose JSON as the information format.
  4. Choose Infer schema so it units the output schema primarily based on the information.

From this supply node, you’ll maintain chaining transforms. When including every remodel, make sure that the chosen node is the final one added so it will get assigned because the mother or father, except indicated in any other case within the directions.

For those who didn’t choose the suitable mother or father, you’ll be able to all the time edit the mother or father by choosing it and selecting one other mother or father within the configuration pane.

Node parent configuration

For every node added, you’ll give it a particular identify (so the node objective exhibits within the graph) and configuration on the Remodel tab.

Each time a remodel adjustments the schema (as an illustration, add a brand new column), the output schema must be up to date so it’s seen to the downstream transforms. You may manually edit the output schema, however it’s extra sensible and safer to do it utilizing the information preview.
Moreover, that means you’ll be able to confirm the transformation are working as far as anticipated. To take action, open the Information preview tab with the remodel chosen and begin a preview session. After you might have verified the remodeled information seems to be as anticipated, go to the Output schema tab and select Use information preview schema to replace the schema mechanically.

As you add new sorts of transforms, the preview may present a message a few lacking dependency. When this occurs, select Finish Session and the beginning a brand new one, so the preview picks up the brand new type of node.

Extract instrument data

Let’s begin by coping with the knowledge on the instrument identify to normalize it into columns which can be simpler to entry within the ensuing output desk.

  1. Add a Cut up String node and identify it Cut up instrument, which can tokenize the instrument column utilizing a whitespace regex: s+ (a single house would do on this case, however this fashion is extra versatile and visually clearer).
  2. We need to maintain the unique instrument data as is, so enter a brand new column identify for the cut up array: instrument_arr.
    Split config
  3. Add an Array To Columns node and identify it Instrument columns to transform the array column simply created into new fields, apart from image, for which we have already got a column.
  4. Choose the column instrument_arr, skip the primary token and inform it to extract the output columns month, day, 12 months, strike_price, sort utilizing indexes 2, 3, 4, 5, 6 (the areas after the commas are for readability, they don’t affect the configuration).
    Array config

The 12 months extracted is expressed with two digits solely; let’s put a stopgap to imagine it’s on this century if they only use two digits.

  1. Add a Derived Column node and identify it 4 digits 12 months.
  2. Enter 12 months because the derived column so it overrides it, and enter the next SQL expression:
    CASE WHEN size(12 months) = 2 THEN ('20' || 12 months) ELSE 12 months END
    Year derived column config

For comfort, we construct an expiration_date area {that a} consumer can have as reference of the final date the choice may be exercised.

  1. Add a Concatenate Columns node and identify it Construct expiration date.
  2. Title the brand new column expiration_date, choose the columns 12 months, month, and day (in that order), and a hyphen as spacer.
    Concatenated date config

The diagram to date ought to appear to be the next instance.


The information preview of the brand new columns to date ought to appear to be the next screenshot.

Data preview

Normalize the variety of contracts

Every of the rows within the information signifies the variety of contracts of every possibility that had been purchased or bought and the batches on which the orders had been stuffed. With out dropping the details about the person batches, we need to have every quantity on a person row with a single quantity worth, whereas the remainder of the knowledge is replicated in every row produced.

First, let’s merge the quantities right into a single column.

  1. Add an Unpivot Columns Into Rows node and identify it Unpivot actions.
  2. Select the columns purchased and bought to unpivot and retailer the names and values in columns named motion and contracts, respectively.
    Unpivot config
    Discover within the preview that the brand new column contracts continues to be an array of numbers after this transformation.
  1. Add an Explode Array Or Map into Rows row named Explode contracts.
  2. Select the contracts column and enter contracts as the brand new column to override it (we don’t must maintain the unique array).

The preview now exhibits that every row has a single contracts quantity, and the remainder of the fields are the identical.

This additionally signifies that order_id is not a novel key. To your personal use instances, that you must determine mannequin your information and if you wish to denormalize or not.
Explode config

The next screenshot is an instance of what the brand new columns appear to be after the transformations to date.
Data preview

Create a abstract desk

Now you create a abstract desk with the variety of contracts traded for every sort and every inventory image.

Let’s assume for illustration functions that the recordsdata processed belong to a single day, so this abstract offers the enterprise customers details about what the market curiosity and sentiment are that day.

  1. Add a Choose Fields node and choose the next columns to maintain for the abstract: image, sort, and contracts.
    Selected fields
  2. Add a Pivot Rows Into Columns node and identify it Pivot abstract.
  3. Mixture on the contracts column utilizing sum and select to transform the sort column.
    Pivot config

Usually, you’ll retailer it on some exterior database or file for reference; on this instance, we put it aside as a CSV file on Amazon S3.

  1. Add an Autobalance Processing node and identify it Single output file.
  2. Though that remodel sort is often used to optimize the parallelism, right here we use it to cut back the output to a single file. Due to this fact, enter 1 within the variety of partitions configuration.
    Autobalance config
  3. Add an S3 goal and identify it CSV Contract abstract.
  4. Select CSV as the information format and enter an S3 path the place the job position is allowed to retailer recordsdata.

The final a part of the job ought to now appear to be the next instance.

  1. Save and run the job. Use the Runs tab to examine when it has completed efficiently.
    You’ll discover a file underneath that path that could be a CSV, regardless of not having that extension. You’ll in all probability want so as to add the extension after downloading it to open it.
    On a software that may learn the CSV, the abstract ought to look one thing like the next instance.

Clear up momentary columns

In preparation for saving the orders right into a historic desk for future evaluation, let’s clear up some momentary columns created alongside the way in which.

  1. Add a Drop Fields node with the Explode contracts node chosen as its mother or father (we’re branching the information pipeline to generate a separate output).
  2. Choose the fields to be dropped: instrument_arr, month, day, and 12 months.
    The remaining we need to maintain so they’re saved within the historic desk we’ll create later.
    Drop fields

Forex standardization

This artificial information comprises fictional operations on two currencies, however in an actual system you can get currencies from markets everywhere in the world. It’s helpful to standardize the currencies dealt with right into a single reference foreign money to allow them to be simply be in contrast and aggregated for reporting and evaluation.

We use Amazon Athena to simulate a desk with approximate foreign money conversions that will get up to date periodically (right here we assume we course of the orders well timed sufficient that the conversion is an inexpensive consultant for comparability functions).

  1. Open the Athena console in the identical Area the place you’re utilizing AWS Glue.
  2. Run the next question to create the desk by setting an S3 location the place each your Athena and AWS Glue roles can learn and write. Additionally, you may need to retailer the desk in a special database than default (when you do this, replace the desk certified identify accordingly within the examples offered).
    CREATE EXTERNAL TABLE default.exchange_rates(foreign money string, exchange_rate double)
    LOCATION 's3://<enter some bucket>/exchange_rates/';

  3. Enter a number of pattern conversions into the desk:
    INSERT INTO default.exchange_rates VALUES ('usd', 1.0), ('eur', 1.09), ('gbp', 1.24);
  4. You need to now be capable of view the desk with the next question:
    SELECT * FROM default.exchange_rates
  5. Again on the AWS Glue visible job, add a Lookup node (as a baby of Drop Fields) and identify it Change fee.
  6. Enter the qualitied identify of the desk you simply created, utilizing foreign money as the important thing and choose the exchange_rate area to make use of.
    As a result of the sector is known as the identical in each the information and the lookup desk, we will simply enter the identify foreign money and don’t must outline a mapping.Lookup config
    On the time of this writing, the Lookup remodel shouldn’t be supported within the information preview and it’ll present an error that the desk doesn’t exist. That is just for the information preview and doesn’t stop the job from working appropriately. The few remaining steps of the publish don’t require you to replace the schema. If that you must run a knowledge preview on different nodes, you’ll be able to take away the lookup node briefly after which put it again.
  7. Add a Derived Column node and identify it Complete in usd.
  8. Title the derived column total_usd and use the next SQL expression:
    spherical(contracts * worth * exchange_rate, 2)
    Currency conversion config
  9. Add a Add Present Timestamp node and identify the column ingest_date.
  10. Use the format %Y-%m-%d on your timestamp (for demonstration functions, we’re simply utilizing the date; you may make it extra exact if you wish to).
    Timestamp config

Save the historic orders desk

To save lots of the historic orders desk, full the next steps:

  1. Add an S3 goal node and identify it Orders desk.
  2. Configure Parquet format with snappy compression, and supply an S3 goal path underneath which to retailer the outcomes (separate from the abstract).
  3. Choose Create a desk within the Information Catalog and on subsequent runs, replace the schema and add new partitions.
  4. Enter a goal database and a reputation for the brand new desk, as an illustration: option_orders.
    Table sink config

The final a part of the diagram ought to now look just like the next, with two branches for the 2 separate outputs.

After you run the job efficiently, you should use a software like Athena to overview the information the job has produced by querying the brand new desk. You will discover the desk on the Athena record and select Preview desk or simply run a SELECT question (updating the desk identify to the identify and catalog you used):

SELECT * FROM default.option_orders restrict 10

Your desk content material ought to look just like the next screenshot.
Table content

Clear up

For those who don’t need to maintain this instance, delete the 2 jobs you created, the 2 tables in Athena, and the S3 paths the place the enter and output recordsdata had been saved.


On this publish, we confirmed how the brand new transforms in AWS Glue Studio might help you do extra superior transformation with minimal configuration. This implies you’ll be able to implement extra ETL makes use of instances with out having to put in writing and keep any code. The brand new transforms are already accessible on AWS Glue Studio, so you should use the brand new transforms at the moment in your visible jobs.

Concerning the writer

Gonzalo Herreros is a Senior Large Information Architect on the AWS Glue crew.

Related Articles


Please enter your comment!
Please enter your name here

Latest Articles