Предварительное решение для фильтра AWS Glue / Redshift (до загрузки в S3) - PullRequest
0 голосов
/ 22 марта 2019

Я работаю над aws Склейку запланированных сценариев преобразования из таблиц Redshift (или представлений) в таблицы Redshift.

Некоторые из моих таблиц огромные, и я не хочу загружать полную таблицу в файлы S3 или длянекоторые из них, я хотел бы иметь пошаговое решение.Поэтому я ищу решение для предварительной фильтрации для AWS Glue / Redshift (до загрузки в S3).

Я знаю, что если вы работаете непосредственно с корзиной S3, вы можете использовать предикатное нажатие, чтобы избежать загрузкиданные, которые вас не волнуют.Кажется, что он не поддерживается в таблицах Redshift.

Знаете ли вы похожее решение для Redshift?Или обходной путь?

Спасибо

1 Ответ

0 голосов
/ 24 марта 2019

Я недавно использую 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 = Нет)

...