Лучший способ прочитать часть огромного стола в AWS GLUE - PullRequest
0 голосов
/ 12 ноября 2018

У меня проблемы с загрузкой большого файла из моего озера данных (в настоящее время хранящегося в postgres) в AWS GLUE. Это 4,3 млрд строк.

При тестировании я обнаружил, что таблица слишком велика, чтобы ее можно было полностью прочитать.

Вот как я загружаю фрейм данных:

large_dynamic_frame = glueContext.create_dynamic_frame.from_catalog(database = "DBNAME",
                                          table_name = "TABLENAME",
                                          redshift_tmp_dir = args["TempDir"],
                                          transformation_ctx = "TABLECTX")

Важные факторы

  • Мне не нужен весь фрейм данных! В конечном итоге я отфильтрую по паре атрибутов и объединю таблицы меньшего размера.

  • Я уже пытался использовать push_down_predicate, но для этого требовалось хранить данные в S3 с использованием определенной организации папок, и, к сожалению, я не могу выбрать уже существующий формат этой таблицы.

  • Я также попытался прочитать в таблице и просто реорганизовать ее в организацию папок S3, необходимую для работы pushdown_predicate, но процесс завершается с «кодом выхода 1» после 5 часов работы.

Основной вопрос

Как я могу прочитать часть таблицы, не используя pushdown predicate?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы также можете использовать чистый код spark / pyspark в Glue и воспользоваться его методами чтения.Вы можете увидеть в их документации, как читать из красное смещение или вообще из любой базы данных SQL через JDBC .Даже читая данные из запроса, как в следующем примере:

# Read data from a query
df = spark.read \
  .format("com.databricks.spark.redshift") \
  .option("url", "jdbc:redshift://redshifthost:5439/database?user=username&password=pass") \
  .option("query", "select x, count(*) my_table group by x") \
  .option("tempdir", "s3n://path/for/temp/data") \
  .load()

Я обнаружил, что в AWS Glue реализована лишь небольшая доля функциональности spark, поэтому я рекомендую использовать spark / pySpark, когда вам нужно что-то сложноеработа над.

0 голосов
/ 14 ноября 2018

К сожалению, предикатный pushdown работает только для S3, как вы уже поняли.

  1. Относительно "кода выхода 1", ваши данные в формате S3 в необработанном формате CSV?Можете ли вы попробовать создать несколько частей bzip2 или lz4.В этом случае нагрузка будет распределена между несколькими работниками.
  2. Сколько DPU выделено для задачи.Эта статья дает хороший обзор планирования емкости DPU.
  3. Или вы можете создать представление в Postgres и использовать его в качестве источника.

Пожалуйста, дайте мне знатьесли это помогло.

...