适用于AWS Glue / Redshift的预过滤器解决方案(在加载到S3中之前)

时间:2019-03-22 09:02:08

标签: amazon-redshift aws-glue

我正在研究从Redshift表(或视图)到Redshift表的AWS Glue计划的转换脚本。

我的某些表非常庞大,我不想将整个表加载到S3文件中,或者对于某些表,我希望有一个增量解决方案。 因此,我正在寻找适用于AWS Glue / Redshift的预过滤器解决方案(在加载到S3中之前)。

我知道,如果您直接在S3存储桶上工作,则可以使用谓词下推来避免加载不需要的数据。似乎Redshift表不支持该功能。

您知道Redshift的相似解决方案吗?还是解决方法?

谢谢

1 个答案:

答案 0 :(得分:0)

我是使用AWS Glue的新手,我现在找到的解决方案是该gumContext.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。

我没有包括存储密码和URL的方法,但是这里是有关Amazon最佳做法的链接(建议): https://aws.amazon.com/blogs/big-data/use-aws-glue-to-run-etl-jobs-against-non-native-jdbc-data-sources/

您可以从元数据中获取参数,但是缺少数据库名称,并且连接名称应为硬编码或通过作业参数 cnx_parameters = gumContext.extract_jdbc_conf(“ Your_Cnx_Name”,catalog_id = None)