Я недавно использую AWS Glue, решение, которое я нашел сейчас, это glueContext.read:
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: [TempDir, JOB_NAME]
args = getResolvedOptions(sys.argv, ['TempDir', 'JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
qry_for_df = """
(SELECT *
FROM table1
WHERE field1 = ‘something’ ) as subq
"""
df = glueContext.read.format("jdbc").option("driver", "com.amazon.redshift.jdbc.Driver").option("url", "jdbc:redshift://…”).option("dbtable", qry_for_df).option("user", "username”).option("password", “XXXXXXXX”).load()
Некоторые соображения: я не нашел способа использовать предопределенный JDBCподключение к нему AWS Glue, поэтому я добавляю в работу путь Jar lib s3: //your-bucket/path/RedshiftJDBC42XXX.jar.
Я не включил способ хранения пароляи URL, но вот ссылка на лучшие практики Amazon (в качестве предложения): https://aws.amazon.com/blogs/big-data/use-aws-glue-to-run-etl-jobs-against-non-native-jdbc-data-sources/
Вы можете взять параметры из своих метаданных, но имя базы данных отсутствует, а имя соединения должно быть жестко закодировано иличерез параметры задания cnx_parameters = glueContext.extract_jdbc_conf ("Your_Cnx_Name", catalog_id = Нет)