读取 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")
重要因素
我不需要整个数据框!我最终会根据几个属性进行过滤,并加入较小的 tables.
我已经尝试过使用 push_down_predicate
,但这需要使用特定的文件夹组织将数据存储在 S3 中,不幸的是我无法选择预table.
的现有格式
我也尝试阅读 table 并简单地将其重新组织为 pushdown_predicate
工作所需的 S3 文件夹组织,但该过程以 "exit code 1" 5 小时后 运行。
主要问题
如何在不使用 pushdown predicate
的情况下读取 table 的一部分?
不幸的是,正如您已经知道的那样,谓词下推仅适用于 S3。
- 关于 "exit code 1",您在 S3 中的数据是原始 CSV 格式吗?您可以尝试创建多部分 bzip2 或 lz4。在这种情况下,负载将由多个工作人员分担。
- 您为任务分配了多少 DPU。 article 很好地概述了 DPU 容量规划。
- 或者您可以在 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。
我在将一个大文件从我的数据湖(目前存储在 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")
重要因素
我不需要整个数据框!我最终会根据几个属性进行过滤,并加入较小的 tables.
我已经尝试过使用
push_down_predicate
,但这需要使用特定的文件夹组织将数据存储在 S3 中,不幸的是我无法选择预table. 的现有格式
我也尝试阅读 table 并简单地将其重新组织为
pushdown_predicate
工作所需的 S3 文件夹组织,但该过程以 "exit code 1" 5 小时后 运行。
主要问题
如何在不使用 pushdown predicate
的情况下读取 table 的一部分?
不幸的是,正如您已经知道的那样,谓词下推仅适用于 S3。
- 关于 "exit code 1",您在 S3 中的数据是原始 CSV 格式吗?您可以尝试创建多部分 bzip2 或 lz4。在这种情况下,负载将由多个工作人员分担。
- 您为任务分配了多少 DPU。 article 很好地概述了 DPU 容量规划。
- 或者您可以在 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。