AWS Glue/Spark 上的交叉连接优化

问题描述

我有 2 个数据框:

df1 - 7 列(ID 和 VARCHAR),行:1,700,000

df2 - 7 列(ID 和 VARCHAR),行:25,000

需要找到所有可能的相似之处,无法跳过笛卡尔积。

AWS Glue:具有 10(或 20)个 G.1X 工作线程的集群

已经测试了 178 个分区(当从更大的 df 过滤 df1 时,Spark 实时计算) 运行时间:10 小时……我停止了工作! 但是在 S3 上,找到了超过 999 个 part-XXX-YYYYY 文件。

问题:如果无法跳过交叉连接,如何在 Glue/Spark 上优化此交叉连接?

解决方法

使用以下方法和 Glue 配置,作业在 121 分钟内完成:

胶水详情=>

工人=>G2.X

工人数量=> 50 。您也可以尝试使用 149,这应该会在 35-45 分钟内完成。

我创建了两个文件:-

df1=> 7 列行:1700000,大小 140 MB(基于列大小,文件大小可能因您而异)

df2=> 7 列行:25000,大小 2 MB

现在我已经用 42500 对第一个数据帧进行了分区。

我如何获得 42500-> 首先,我创建了 DF1 有 1 条记录,DF2 有 25000 条记录,并保存了交叉连接输出。

文件大小为 3.5 MB,为了获得最佳性能,最佳分区应在 128 MB 左右。 假设您要将一个分区大小设为 150 MB。

现在从 1 个记录生成的输出为 3.5 MB,使分区大小为 150 MB 我们需要大约每个分区 42 条记录。 我们有 1700000 条记录,这使得它大约。 40500 个分区。

对您来说,1 条记录的大小可能不同。使用相同的方法来计算分区大小。 修复后,使用cross join和broadcast即可。

df1.reparition(40500)

df.crossJoin(broadcast(df2))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...