aws Glue / Redshift 的预过滤解决方案(在加载到 S3 之前)
Posted
技术标签:
【中文标题】aws Glue / Redshift 的预过滤解决方案(在加载到 S3 之前)【英文标题】:Pre filter solution for aws Glue / Redshift (before the loading into S3) 【发布时间】:2019-03-22 09:02:08 【问题描述】:我正在编写从 Redshift 表(或视图)到 Redshift 表的 aws Glue 计划转换脚本。
我的一些表很大,我不想将整个表加载到 S3 文件中,或者对于其中的一些,我想要一个增量解决方案。 因此,我正在寻找适用于 aws Glue / Redshift 的预过滤器解决方案(在加载到 S3 之前)。
我知道,如果您直接在 S3 存储桶上工作,则可以使用谓词下推来避免加载您不关心的数据。 Redshift 表似乎不支持它。
您知道 Redshift 的类似解决方案吗?还是解决方法?
谢谢
【问题讨论】:
【参考方案1】:我是使用 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 库路径 s3://your-bucket/path/RedshiftJDBC42XXX.jar。
我没有包含存储密码和 url 的方法,但这里是亚马逊最佳实践的链接(作为建议): 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)
【讨论】:
您好,感谢您的帮助。值得一试,老实说,我没有找到其他解决方案 如果你能分享结果会很好。成功了吗? 我没有成功,所以我决定采用另一个解决方案:我创建了一个视图。它有点难看,但不费吹灰之力就可以很好地工作:-/以上是关于aws Glue / Redshift 的预过滤解决方案(在加载到 S3 之前)的主要内容,如果未能解决你的问题,请参考以下文章
AWS Glue to Redshift:是否可以替换,更新或删除数据?
将 Parquet 文件从 AWS Glue 加载到 Redshift