通过 DataBricks 将大量表下载到 ADLS 只是为了将其连接到较小的表,效率低下吗?

问题描述 投票:0回答:1

如果这个问题不明确,请告诉我,我可以提供更多详细信息。我的 DataBricks 环境附加到 Azure Synapse 实例。我们有大量的 ADLS 存储。 PySpark 脚本的第一部分根据 SQL 查询创建两个数据帧,这两个数据帧将在不同的服务器上运行。其中一个数据帧很小(相当于 30,000 条记录),另一个数据帧很大(相当于 10 亿条记录)。我们在“ID”(只是一个示例列名称)上对两个数据帧进行内部联接,脚本的其余部分仅使用联接的结果,在本例中始终具有 30,000 条或更少的记录。我们本质上是使用连接作为较大表的过滤器。我觉得仅仅为了过滤掉整个大表而拉入它一定是非常低效的。有没有更好的方法使用 PySpark 在 DataBricks 中执行此操作?

我只是将较小的表上传到保存较大表的服务器,但我们有安全限制,阻止我们这样做。

azure pyspark databricks azure-synapse
1个回答
0
投票

您可以考虑使用以下任一策略。

  1. 广播较小的表:如果您的一个数据帧(在本例中为较小的数据帧)可以容纳在内存中,请考虑将其广播到所有工作节点。广播避免了在网络上混洗数据,这可以显着加快连接操作。

从 pyspark.sql.functions 导入广播

broadcast_small_df = 广播(small_df) result_df = large_df.join(broadcast_small_df, on=“ID”,how=“内部”)

  1. 重新分区大表:如果较大的表太大而无法广播,请考虑根据连接列(在您的情况下为“ID”)对其进行重新分区。这可确保具有相同“ID”的行位于同一分区中。

num_partitions = 100 # 根据需要调整

重新分区_large_df = large_df.repartition(num_partitions, "ID") result_df = repartitioned_large_df.join(small_df, on="ID", how="inner")

© www.soinside.com 2019 - 2024. All rights reserved.