Десять нових візуальних трансформацій в AWS Glue Studio

Десять нових візуальних трансформацій в AWS Glue Studio

Вихідний вузол: 2641422

AWS Glue Studio це графічний інтерфейс, який дозволяє легко створювати, запускати та контролювати завдання вилучення, трансформації та завантаження (ETL) у Клей AWS. Це дозволяє візуально створювати робочі процеси перетворення даних за допомогою вузлів, які представляють різні етапи обробки даних, які пізніше автоматично перетворюються на код для запуску.

AWS Glue Studio нещодавно випущений Ще 10 візуальних трансформацій, які дозволяють створювати складніші завдання візуально без навичок програмування. У цій публікації ми обговорюємо потенційні випадки використання, які відображають загальні потреби ETL.

Нові перетворення, які будуть продемонстровані в цьому дописі: об’єднання, розділення рядка, масив до стовпців, додавання поточної позначки часу, зведення рядків до стовпців, скасування зведення стовпців до рядків, пошук, рознесення масиву або зіставлення в стовпці, похідний стовпець і обробка автобалансу .

Огляд рішення

У цьому випадку ми маємо декілька файлів JSON з операціями з опціонами на акції. Ми хочемо зробити деякі перетворення перед збереженням даних, щоб полегшити їх аналіз, а також хочемо створити окремий підсумок набору даних.

У цьому наборі даних кожен рядок представляє торгівлю опціонними контрактами. Опціони – це фінансові інструменти, які надають право, але не зобов’язання, купувати чи продавати акції за фіксованою ціною (так звана  страйкова ціна) до визначеного терміну придатності.

Вхідні дані

Дані відповідають такій схемі:

  • order_id – Унікальний ідентифікатор
  • символ – Код, який зазвичай складається з кількох літер для ідентифікації корпорації, яка випускає базові акції
  • інструмент – Назва, яка ідентифікує конкретний варіант, який купується або продається
  • валюта – Код валюти ISO, у якій виражено ціну
  • price – Сума, сплачена за придбання кожного опціонного контракту (на більшості бірж один контракт дозволяє купити або продати 100 акцій)
  • обмін – Код біржового центру або місця, де торгувався опціон
  • проданий – Список кількості контрактів, які були виділені для виконання замовлення на продаж, коли це торгівля на продаж
  • куплений – Список кількості контрактів, які були виділені для виконання замовлення на купівлю, коли це купівля

Нижче наведено зразок синтетичних даних, створених для цієї публікації:

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

Вимоги ETL

Ці дані мають низку унікальних характеристик, які часто зустрічаються в старих системах, які ускладнюють використання даних.

Нижче наведено вимоги ETL:

  • Назва приладу містить цінну інформацію, яку люди повинні зрозуміти; ми хочемо нормалізувати його в окремі стовпці для легшого аналізу.
  • Атрибути bought та sold є взаємовиключними; ми можемо об’єднати їх в одну колонку з номерами контрактів і створити іншу колонку, у якій буде вказано, чи були контракти куплені чи продані в цьому порядку.
  • Ми хочемо зберегти інформацію про розподіл окремих контрактів, але як окремі рядки замість того, щоб змушувати користувачів мати справу з масивом чисел. Ми могли б скласти цифри, але втратили б інформацію про те, як було виконано замовлення (вказує на ліквідність ринку). Замість цього ми вирішили денормалізувати таблицю, щоб кожен рядок містив одну кількість контрактів, розбиваючи замовлення з кількома номерами на окремі рядки. У стисненому стовпчастому форматі додатковий розмір набору даних цього повторення часто невеликий, коли застосовано стиснення, тому прийнятно зробити набір даних легшим для запиту.
  • Ми хочемо створити зведену таблицю обсягу для кожного типу опціону (колл і пут) для кожної акції. Це вказує на ринкові настрої для кожної акції та ринку в цілому (жадібність проти страху).
  • Щоб увімкнути загальні торговельні підсумки, ми хочемо надати для кожної операції загальну суму та стандартизувати валюту в доларах США, використовуючи приблизне посилання на конвертацію.
  • Ми хочемо додати дату, коли відбулися ці перетворення. Це може бути корисно, наприклад, щоб мати довідку про те, коли було здійснено конвертацію валюти.

Виходячи з цих вимог, робота дасть два результати:

  • Файл CSV із підсумком кількості контрактів для кожного символу та типу
  • Таблиця каталогу для збереження історії замовлень після виконання вказаних перетворень
    Схема даних

Передумови

Вам знадобиться власне відро S3, щоб слідувати цьому випадку використання. Щоб створити нове відро, див Створення відра.

Створення синтетичних даних

Щоб слідувати цій публікації (або експериментувати з такими даними самостійно), ви можете створити цей набір даних синтетично. Наведений нижче сценарій Python можна запустити в середовищі Python із встановленим Boto3 і доступом до нього Служба простого зберігання Amazon (Amazon S3).

Щоб згенерувати дані, виконайте такі кроки:

  1. У AWS Glue Studio створіть нове завдання з опцією Редактор сценаріїв оболонки Python.
  2. Дайте роботу назву та на Деталі роботи виберіть a відповідна роль і назва сценарію Python.
  3. У Деталі роботи розділ, розшир Розширені властивості і прокрутіть вниз до Параметри роботи.
  4. Введіть параметр з назвою --bucket і призначте як значення назву сегмента, який ви хочете використовувати для зберігання зразків даних.
  5. Введіть такий сценарій у редактор оболонки AWS Glue:
    import argparse
    import boto3
    from datetime import datetime
    import io
    import json
    import random
    import sys # Configuration
    parser = argparse.ArgumentParser()
    parser.add_argument('--bucket')
    args, ignore = parser.parse_known_args()
    if not args.bucket: raise Exception("This script requires an argument --bucket with the value specifying the S3 bucket where to store the files generated") data_bucket = args.bucket
    data_path = "transformsblog/inputdata"
    samples_per_file = 1000 # Create a single file with synthetic data samples
    s3 = boto3.client('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 range(samples_per_file): stock = random.choice(sample_stocks) symbol = stock[0] ref_price = stock[1] currency = stock[2] strike_price = round(ref_price * 0.9 + ref_price * random.uniform(0.01, 0.3)) sample = { "order_id": int(datetime.now().timestamp() * 1000) + i, "symbol": stock[0], "instrument":f"{symbol} {random.choice(dates)} {strike_price} {random.choice(option_type)}", "currency": currency, "price": round(random.uniform(0.5, 20.1), 2), "exchange": "EDGX" if currency == "usd" else "XETR" } sample[random.choice(operations)] = [random.randrange(1,100) for i in range(random.randrange(1,5))] buff.write(json.dumps(sample).encode()) buff.write("n".encode()) s3.put_object(Body=buff.getvalue(), Bucket=data_bucket, Key=f"{data_path}/{int(datetime.now().timestamp())}.json")

  6. Запустіть завдання та зачекайте, доки на вкладці «Запуски» воно не відобразиться як успішне завершення (це має зайняти кілька секунд).

Кожен запуск генеруватиме файл JSON із 1,000 рядків у вказаному сегменті та префіксі transformsblog/inputdata/. Ви можете запустити завдання кілька разів, якщо хочете протестувати з більшою кількістю вхідних файлів.
Кожен рядок у синтетичних даних є рядком даних, що представляє об’єкт JSON, як показано нижче:

{ "order_id":1681986991888, "symbol":"AMZN", "instrument":"AMZN APR 28 23 100 PUT", "currency":"usd", "price":2.89, "exchange":"EDGX", "sold":[88,49]
}

Створіть візуальне завдання AWS Glue

Щоб створити візуальне завдання AWS Glue, виконайте такі дії:

  1. Перейдіть до AWS Glue Studio та створіть завдання за допомогою цієї опції Візуал із чистим полотном.
  2. Редагувати Untitled job дати йому назву та призначити роль, яка підходить для AWS Glue на Деталі роботи Вкладка.
  3. Додайте джерело даних S3 (ви можете назвати його JSON files source) і введіть URL-адресу S3, під якою зберігаються файли (наприклад, s3://<your bucket name>/transformsblog/inputdata/), а потім виберіть JSON як формат даних.
  4. Select Виведіть схему тому він встановлює вихідну схему на основі даних.

З цього вихідного вузла ви будете продовжувати зв’язувати перетворення. Додаючи кожне перетворення, переконайтеся, що вибраний вузол є останнім доданим, щоб він був призначений як батьківський, якщо інше не зазначено в інструкціях.

Якщо ви не вибрали належного батьківського елемента, ви завжди можете змінити його, вибравши його та вибравши іншого батьківського елемента на панелі конфігурації.

Конфігурація батьківського вузла

Для кожного доданого вузла ви дасте йому конкретну назву (тобто призначення вузла відображається на графіку) і конфігурацію на Перетворення Вкладка.

Кожного разу, коли перетворення змінює схему (наприклад, додає новий стовпець), схему виводу потрібно оновлювати, щоб вона була видимою для перетворень, що знаходяться нижче за течією. Ви можете редагувати вихідну схему вручну, але практичніше та безпечніше робити це за допомогою попереднього перегляду даних.
Крім того, таким чином ви можете переконатися, що перетворення працює належним чином. Для цього відкрийте Попередній перегляд даних вкладку з вибраним перетворенням і розпочніть сеанс попереднього перегляду. Переконавшись, що перетворені дані виглядають належним чином, перейдіть до Схема виведення та виберіть Використовуйте схему попереднього перегляду даних для автоматичного оновлення схеми.

Коли ви додаєте нові види перетворень, попередній перегляд може відображати повідомлення про відсутню залежність. Коли це станеться, виберіть Завершити сесію і почати новий, тому попередній перегляд підбирає новий тип вузла.

Отримайте інформацію про інструмент

Давайте почнемо з інформації про назву інструмента, щоб нормалізувати її в стовпці, до яких легше отримати доступ у результуючій вихідній таблиці.

  1. Додавати Розділити рядок вузол і назвіть його Split instrument, який токенізуватиме стовпець інструменту за допомогою регулярного виразу пробілу: s+ (у цьому випадку підійде один пробіл, але цей спосіб більш гнучкий і візуально зрозуміліший).
  2. Ми хочемо зберегти оригінальну інформацію про інструмент, тому введіть нову назву стовпця для розділеного масиву: instrument_arr.
    Розділена конфігурація
  3. Додайте Масив до стовпців вузол і назвіть його Instrument columns щоб перетворити щойно створений стовпець масиву в нові поля, за винятком symbol, для якого вже є колонка.
  4. Виберіть стовпець instrument_arr, пропустіть перший маркер і скажіть йому витягнути вихідні стовпці month, day, year, strike_price, type за допомогою індексів 2, 3, 4, 5, 6 (пробіли після ком призначені для зручності читання, вони не впливають на конфігурацію).
    Конфігурація масиву

Витягнутий рік виражається лише двома цифрами; давайте поставимо проміжок, щоб припустити, що це в цьому столітті, якщо вони просто використовують дві цифри.

  1. Додавати Похідний стовпець вузол і назвіть його Four digits year.
  2. Що натомість? Створіть віртуальну версію себе у year як похідний стовпець, щоб він замінив його, і введіть такий вираз SQL:
    CASE WHEN length(year) = 2 THEN ('20' || year) ELSE year END
    Конфігурація стовпця, отриманого за рік

Для зручності ми будуємо expiration_date поле, яке користувач може мати як посилання на останню дату, коли опцію можна використати.

  1. Додавати Об’єднати стовпці вузол і назвіть його Build expiration date.
  2. Назвіть новий стовпець expiration_date, виділіть стовпці year, month та day (у такому порядку) і дефіс як пробіл.
    Конфігурація об’єднаної дати

Поки що діаграма має виглядати як наведений нижче приклад.

DAG

Попередній перегляд даних нових стовпців має виглядати так, як наведений нижче знімок екрана.

Попередній перегляд даних

Унормувати кількість договорів

Кожен із рядків у даних вказує кількість контрактів кожного опціону, які були куплені чи продані, і партії, за якими були виконані замовлення. Не втрачаючи інформації про окремі партії, ми хочемо мати кожну суму в окремому рядку з єдиним значенням суми, тоді як решта інформації буде відтворено в кожному створеному рядку.

Спочатку давайте об’єднаємо суми в один стовпець.

  1. Додайте Скасувати зведення стовпців у рядки вузол і назвіть його Unpivot actions.
  2. Виберіть колонки bought та sold щоб скасувати зведення та зберегти імена та значення в названих стовпцях action та contracts, відповідно.
    Відмінити конфігурацію
    Зверніть увагу на попередній перегляд нового стовпця contracts все ще залишається масивом чисел після цього перетворення.
  1. Додайте Розбийте масив або карту на рядки рядок з назвою Explode contracts.
  2. Виберіть contracts і введіть contracts як новий стовпець, щоб замінити його (нам не потрібно зберігати вихідний масив).

Попередній перегляд тепер показує, що кожен рядок має один contracts суму, а решта полів однакові.

Це також означає, що order_id більше не є унікальним ключем. Для власних випадків використання вам потрібно вирішити, як моделювати дані та чи хочете ви денормалізувати чи ні.
Рознести конфігурацію

На наступному знімку екрана показано, як виглядають нові стовпці після перетворень.
Попередній перегляд даних

Створіть зведену таблицю

Тепер ви створюєте зведену таблицю з кількістю торгованих контрактів для кожного типу та кожного символу акцій.

Для ілюстрації припустімо, що оброблені файли належать до одного дня, тож цей підсумок дає бізнес-користувачам інформацію про інтерес і настрої ринку в цей день.

  1. Додавати Виберіть Поля вузол і виберіть наступні стовпці, щоб зберегти для підсумку: symbol, type та contracts.
    Вибрані поля
  2. Додавати Звести рядки в стовпці вузол і назвіть його Pivot summary.
  3. Агрегат на в contracts стовпець за допомогою sum і виберіть конвертувати type колонка.
    Зведена конфігурація

Зазвичай ви зберігаєте його в зовнішній базі даних або файлі для довідки; у цьому прикладі ми зберігаємо його як файл CSV на Amazon S3.

  1. Додайте Обробка автобалансу вузол і назвіть його Single output file.
  2. Хоча цей тип перетворення зазвичай використовується для оптимізації паралелізму, тут ми використовуємо його, щоб скоротити вихід до одного файлу. Тому вводьте 1 у конфігурації кількості розділів.
    Конфігурація автобалансу
  3. Додайте ціль S3 і назвіть її CSV Contract summary.
  4. Виберіть CSV як формат даних і введіть шлях S3, де посадовій ролі дозволено зберігати файли.

Остання частина роботи тепер має виглядати як наведений нижче приклад.
DAG

  1. Збережіть і запустіть завдання. Використовувати Runs щоб перевірити успішне завершення.
    За цим шляхом ви знайдете файл CSV, незважаючи на відсутність такого розширення. Ймовірно, вам знадобиться додати розширення після завантаження, щоб відкрити його.
    В інструменті, який може зчитувати CSV, резюме має виглядати приблизно так, як наведено нижче.
    Електронна таблиця

Очистіть тимчасові стовпці

Готуючись до збереження замовлень у історичній таблиці для майбутнього аналізу, давайте очистимо деякі тимчасові стовпці, створені під час цього.

  1. Додавати Опустіть поля вузол з Explode contracts вузол, вибраний як його батьківський (ми розгалужуємо конвеєр даних, щоб створити окремий вихід).
  2. Виберіть поля, які потрібно видалити: instrument_arr, month, day та year.
    Решту ми хочемо зберегти, щоб вони були збережені в історичній таблиці, яку ми створимо пізніше.
    Поля падіння

Стандартизація валюти

Ці синтетичні дані містять вигадані операції з двома валютами, але в реальній системі ви можете отримати валюти з ринків у всьому світі. Корисно стандартизувати валюти, що обробляються, у єдину базову валюту, щоб їх можна було легко порівнювати та агрегувати для звітності та аналізу.

Ми використовуємо Амазонка Афіна щоб імітувати таблицю з приблизними конвертаціями валют, яка періодично оновлюється (тут ми припускаємо, що ми обробляємо замовлення досить своєчасно, щоб конвертація була розумним представником для порівняння).

  1. Відкрийте консоль Athena в тому ж регіоні, де ви використовуєте AWS Glue.
  2. Виконайте наведений нижче запит, щоб створити таблицю, встановивши розташування S3, де ваші ролі Athena та AWS Glue можуть читати та писати. Крім того, ви можете зберегти таблицю в іншій базі даних default (якщо ви це зробите, оновіть кваліфіковане ім’я таблиці відповідно до наданих прикладів).
    CREATE EXTERNAL TABLE default.exchange_rates(currency string, exchange_rate double)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    LOCATION 's3://<enter some bucket>/exchange_rates/';

  3. Введіть кілька зразків перетворень у таблицю:
    INSERT INTO default.exchange_rates VALUES ('usd', 1.0), ('eur', 1.09), ('gbp', 1.24);
  4. Тепер ви зможете переглянути таблицю за таким запитом:
    SELECT * FROM default.exchange_rates
  5. Повернувшись до візуального завдання AWS Glue, додайте a Пошук вузол (як дочірній елемент Drop Fields) і назвіть його Exchange rate.
  6. Введіть якісну назву таблиці, яку ви щойно створили, використовуючи currency як ключ і виберіть exchange_rate поле для використання.
    Оскільки поле має однакову назву як у даних, так і в таблиці пошуку, ми можемо просто ввести назву currency і не потрібно визначати відображення.Конфігурація пошуку
    На момент написання цієї статті перетворення підстановки не підтримується в попередньому перегляді даних, і воно показуватиме помилку про те, що таблиця не існує. Це лише для попереднього перегляду даних і не перешкоджає правильній роботі завдання. Кілька кроків публікації, що залишилися, не потребують оновлення схеми. Якщо вам потрібно запустити попередній перегляд даних на інших вузлах, ви можете тимчасово видалити вузол пошуку, а потім повернути його назад.
  7. Додавати Похідний стовпець вузол і назвіть його Total in usd.
  8. Назвіть похідний стовпець total_usd і використовуйте такий вираз SQL:
    round(contracts * price * exchange_rate, 2)
    Конфігурація конвертації валют
  9. Додавати Додайте позначку поточного часу вузол і назвіть стовпець ingest_date.
  10. Використовуйте формат %Y-%m-%d для вашої позначки часу (для демонстрації ми використовуємо лише дату; ви можете зробити її більш точною, якщо хочете).
    Конфігурація позначки часу

Збережіть таблицю історичних замовлень

Щоб зберегти таблицю історичних замовлень, виконайте такі дії:

  1. Додайте цільовий вузол S3 і назвіть його Orders table.
  2. Налаштуйте формат Parquet із швидким стисненням і надайте цільовий шлях S3, у якому зберігатимуться результати (окремо від підсумку).
  3. Select Створіть таблицю в каталозі даних і під час наступних запусків оновіть схему та додайте нові розділи.
  4. Введіть цільову базу даних і назву для нової таблиці, наприклад: option_orders.
    Конфігурація мийки столу

Остання частина діаграми тепер має виглядати так, як показано нижче, з двома гілками для двох окремих виходів.
DAG

Після успішного виконання завдання ви можете використовувати такий інструмент, як Athena, щоб переглянути дані, створені завданням, зробивши запит до нової таблиці. Ви можете знайти таблицю в списку Афіни і вибрати Таблиця попереднього перегляду або просто запустіть запит SELECT (оновлюючи ім’я таблиці до імені та каталогу, які ви використовували):

SELECT * FROM default.option_orders limit 10

Вміст вашої таблиці має виглядати так, як на знімку екрана нижче.
Вміст таблиці

Прибирати

Якщо ви не хочете зберігати цей приклад, видаліть дві створені вами роботи, дві таблиці в Athena та шляхи S3, де зберігалися вхідні та вихідні файли.

Висновок

У цьому дописі ми показали, як нові трансформації в AWS Glue Studio можуть допомогти вам виконати розширені трансформації з мінімальною конфігурацією. Це означає, що ви можете реалізувати більше випадків використання ETL без необхідності писати та підтримувати будь-який код. Нові трансформації вже доступні в AWS Glue Studio, тому ви можете використовувати нові трансформації вже сьогодні у своїх візуальних роботах.


Про автора

Гонсало Еррерос є старшим архітектором великих даних у команді AWS Glue.

Часова мітка:

Більше від Великі дані AWS