读取 AWS GLUE 巨大 table 的一部分的最佳方式

Best way to read in part of a huge table to AWS GLUE

我在将一个大文件从我的数据湖(目前存储在 postgres 中)加载到 AWS GLUE 时遇到了一些问题。它是 4.3 十亿 行。

在测试中,我发现 table 太大而无法完全读入。

这是我加载数据框的方式:

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

重要因素

主要问题

如何在不使用 pushdown predicate 的情况下读取 table 的一部分?

不幸的是,正如您已经知道的那样,谓词下推仅适用于 S3。

  1. 关于 "exit code 1",您在 S3 中的数据是原始 CSV 格式吗?您可以尝试创建多部分 bzip2 或 lz4。在这种情况下,负载将由多个工作人员分担。
  2. 您为任务分配了多少 DPU。 article 很好地概述了 DPU 容量规划。
  3. 或者您可以在 Postgres 中创建一个视图并将其用作源。

如果有帮助,请告诉我。

您还可以在 Glue 中使用纯 spark/pyspark 代码并利用其读取方法。 您可以在他们的文档中看到如何从 redshift or in general any SQL DB through 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。