我正在尝试运行查询以通过 AWS Glue 作业从 redshift 表中读取数据。当它从表中读取数据时,它创建的数据框只有 1 个分区,并且从 Redshift 表中读取数据需要花费大量时间(从 Redshift 表中读取数据是一个复杂的查询,有多个连接)
df = spark.read \
.format("jdbc") \
.option("url", url) \
.option("query", query) \
.option("numPartitions", 10) \
.option("fetchsize", "10000") \
.option("batchsize", "10000")
.load()
我使用 numPartitions 为 10,但它仍在读取一个分区中的全部数据。不知道为什么在读取时创建 10 个分区不受影响。
任何人都可以帮助我理解为什么 option("numPartitions",10) 无效以及我们如何在从 redshift 读取数据时实现并行性以提高 jdbc 读取的性能。
这也是通过将复杂查询传递给spark.read.jdbc来从redshift读取数据的最佳方法。
非常感谢对此的任何帮助。
================================================== 我厌倦了博格丹给出的建议,但它仍然没有带来任何改进。
它总是与 2 个执行器一起运行(1 个用于驱动程序,1 个用于工作节点)。确实,我们如何提高读取并行性。我尝试了以下不同的选项,但没有看到任何改进。我正在寻找与 10 到 20 名执行者一起阅读的内容,非常感谢任何建议。
DF_options = {
"connectionName": connection,
"url": url,
"sampleQuery": query,
"user": user,
"password": pwd,
"redshiftTmpDir": "s3://bucket/temp/",
"hashfield": "location",
"hashexpression": "id",
"hashpartitions": "5"
}
DF = glueContext.create_dynamic_frame_from_options(connection_type="redshift",
connection_options=DF_options ,
transformation_ctx="DF")
谢谢, 巴布
这对我在红移查询上非常有效:
print(f"Executing SQL query = {sql_query}")
# Script generated for node Amazon Redshift
AmazonRedshift_node1 = glueContext.create_dynamic_frame.from_options(
connection_type="redshift",
connection_options={
"sampleQuery": sql_query ,
"redshiftTmpDir": "s3://aws-glue-assets-***/temporary/",
"useConnectionProperties": "true",
"connectionName": "your-connection-name",
"aws_iam_user": "arn:aws:iam::123456789:role/yourGlueRole"
},
transformation_ctx="AmazonRedshift_node1",)
print("Size of DynamicFrame: {}".format(AmazonRedshift_node1.toDF().count()))