[英]Cross join optimizations on AWS Glue/Spark
我有2个数据框:
df1 - 7 列(ID 和 VARCHAR),行:1,700,000
df2 - 7 列(ID 和 VARCHAR),行:25,000
需要找到所有可能的相似之处,没有办法跳过笛卡尔积。
AWS Glue:具有 10 个(或 20 个)G.1X Worker 的集群
已经针对 178 个分区进行了测试(当从更大的 df 过滤 df1 时,Spark 会即时计算)运行时间:10 小时......我停止了这项工作,但在 S3 上。 找到超过 999 个 part-XXX-YYYYY 文件。
问题:如果无法跳过交叉连接,如何优化 Glue/Spark 上的交叉连接?
使用以下方法和 Glue 配置,作业在 121 分钟内完成:
胶水细节=>
工人=>G2.X
工人数量=> 50。您也可以尝试使用 149,这应该在 35-45 分钟内完成工作。
我创建了两个文件:-
df1=> 7 columns rows: 1700000, size 140 MB (根据列大小,文件大小可能会有所不同)
df2=> 7 列行:25000,大小 2 MB
现在我已经将第一个 dataframe 分区为 42500。
我是如何获得 42500-> 首先我创建了 DF1 和 1 条记录,DF2 和 25000 并保存,交叉加入 output。
它是 3.5 MB 的文件,为了获得最佳性能,最佳分区应该在 128 MB 左右。 假设您要将一个分区大小设为 150 MB。
现在从 1 条记录生成的 output 是 3.5 MB,要制作 150 MB 的分区大小,我们需要大约。 每个分区 42 条记录。 我们有 1700000 条记录,这使得它大约。 40500 个分区。
对您来说,1 条记录的大小可能会有所不同。 使用相同的方法来计算分区大小。 修复后,只需使用带广播的交叉连接即可。
df1.reparition(40500)
df.crossJoin(broadcast(df2))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.