我正在研究aws从Redshift表(或视图)到Redshift表的Glue预定转换脚本。
我的一些表是巨大的,我不想将整个表加载到S3文件或其中一些,我想有一个增量解决方案。所以我正在为aws Glue / Redshift寻找一个预过滤解决方案(在加载到S3之前)。
我知道如果你直接在S3存储桶上工作,你可以使用谓词下推来避免加载你不关心的数据。似乎Redshift表不支持它。
你知道Redshift的相似解决方案吗?还是一个解决方法?
谢谢
我是使用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()
一些注意事项:我没有找到使用AWS Glue的预定义JDBC连接的方法,因此我在作业中添加了Jar lib路径s3://your-bucket/path/RedshiftJDBC42XXX.jar。
我没有包含存储密码和网址的方法,但这里是亚马逊最佳实践的链接(作为建议):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 = None)