Перезаписать таблицы MySQL с помощью AWS Glue

У меня есть лямбда-процесс, который иногда опрашивает API для последних данных. Эти данные имеют уникальные ключи, и я хотел бы использовать клей для обновления таблицы в MySQL. Есть ли возможность перезаписать данные с помощью этого ключа? (Аналогично режиму Spark=перезапись). Если нет - Могу ли я усечь таблицу в клею перед вставкой всех новых данных?

спасибо

2 ответов


я столкнулся с той же проблемой с Redshift, и лучшим решением, которое мы могли придумать, было создать класс Java, который загружает драйвер MySQL и выдает усеченную таблицу:

package com.my.glue.utils.mysql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

@SuppressWarnings("unused")
public class MySQLTruncateClient {
    public void truncate(String tableName, String url) throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        try (Connection mysqlConnection = DriverManager.getConnection(url);
            Statement statement = mysqlConnection.createStatement()) {
            statement.execute(String.format("TRUNCATE TABLE %s", tableName));
        }
    }
}

загрузите эту банку в S3 вместе с зависимостью от MySQL Jar и сделайте свою работу зависимой от них. В скрипте PySpark можно загрузить метод усечения с помощью:

java_import(glue_context._jvm, "com.my.glue.utils.mysql.MySQLTruncateClient")
truncate_client = glue_context._jvm.MySQLTruncateClient()
truncate_client.truncate('my_table', 'jdbc:mysql://...')

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

  • создайте промежуточную таблицу в mysql и загрузите новые данные в эту таблицу.
  • выполнить команду: REPLACE INTO myTable SELECT * FROM myStagingTable;
  • усечь промежуточную таблицу

Это можно сделать с помощью:

import sys from awsglue.transforms
import * from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

import pymysql
pymysql.install_as_MySQLdb()
import MySQLdb
db = MySQLdb.connect("URL", "USERNAME", "PASSWORD", "DATABASE")
cursor = db.cursor()
cursor.execute("REPLACE INTO myTable SELECT * FROM myStagingTable")
cursor.fetchall()

db.close()
job.commit()