问题描述
我有 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))