После завершения работы AWS Glue как выполнить сценарий SQL или хранимую процедуру? - PullRequest
0 голосов
/ 01 апреля 2019

Я изучаю клей AWS.В традиционном ETL распространенным шаблоном является поиск первичного ключа из таблицы назначения, чтобы решить, нужно ли вам выполнить обновление или вставку (иначе говоря, шаблон проектирования upsert).С клеем, похоже, нет такого же контроля.Простое написание динамического кадра - это просто процесс вставки.Есть два шаблона проектирования, которые я могу придумать, как решить эту проблему:

  1. Загрузить назначение как фрейм данных и в искре, левое внешнее соединение, чтобы вставить только новые строки (как бы вы обновили строки, если вам нужно«удалить, затем вставить». Так как я новичок в Spark, это для меня самое чуждое)
  2. Загрузить данные в таблицу этапов и затем использовать SQL для окончательного слияния

Это второй метод, который я исследую первым.Как я могу в мире AWS выполнить сценарий SQL или хранимую процедуру после завершения задания AWS Glue?Вы выполняете работу с оболочкой Python, лямбда, непосредственно часть клея, каким-то другим способом?

1 Ответ

1 голос
/ 02 апреля 2019

Я использовал библиотеку pymysql в качестве zip-файла, загруженного в AWS S3 и настроенного в параметрах задания AWS Glue.А для UPSERT я использовал INSERT INTO TABLE .... ON DUPLICATE KEY.

Поэтому, основываясь на проверках первичного ключа, код либо обновит запись, если она уже существует, либо вставит новую запись.Надеюсь это поможет.Пожалуйста, укажите это:

import pymysql

rds_host  = "rds.url.aaa.us-west-2.rds.amazonaws.com"
name = "username"
password = "userpwd"
db_name = "dbname"
conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)

with conn.cursor() as cur:
   insertQry=INSERT INTO ZIP_TERR(zip_code, territory_code, territory_name, 
   state) VALUES(zip_code, territory_code, territory_name, state) ON 
   DUPLICATE KEY UPDATE territory_name = VALUES(territory_name), state = 
   VALUES(state);"
   cur.execute(insertQry)
   conn.commit()
   cur.close()

В приведенном выше примере кода территория, почтовый индекс являются первичными ключами.См. Также здесь: Подробнее о циклических вставках с использованием циклов for

...