Spark 和公共分区器:由同一键分区的两个单独的引用是否仅在连接时加载它们的公共分区?

问题描述

法国城市数据(会计、企业、工作...)可以方便地按部门(29=Finistère33=Gironde 等...)进行分区,在我的数据集中,这个字段被命名为 { {1}}。

我有很多这些城市的企业、会计、税务等参考资料,它们在这些部门分区内按codeDepartement排序:
codeCommune


那么,到了我想加入他们进行分析的时候了:

  • 我有 enterprises = enterprises.repartition(col("codeDepartement")).sortWithinPartition("codeCommune") 的 master 配置。

  • 我想研究菲尼斯泰尔的城市。这意味着 Apache Spark 将加载 parquet 文件local[12] 以创建内部 RDD cities\cities_part_29 或类似的东西,我认为它确实如此。


但是当连接步骤开始时,即使连接条件是这样的:
cities_rdd_29
是否足以确保 Spark只创建来自 enterprises.col("codeCommune") = cities.col("codeCommune") 的内部企业 RDD enterprises_rdd_29 并赢得'不尝试在其他人中搜索

  1. 或者这还不够,我应该为连接条件添加enterprises\enterprises_part_29

  2. 或者,这还不够吗,我应该有一个显式的通用分区器链接这两个数据集,
    然后,如何为 Dataset 创建这样的分区器?

  3. 我在误导,我还遗漏了什么?

解决方法

由同一个键分区的两个单独的引用是否只会在连接时加载它们的公共分区?

由连接键分区的两个数据帧将被加载到允许本地连接的相同分区中。但是,看起来您已按 join 列以外的列进行分区,因此会出现 shuffle。为避免这种情况,请在加入之前通过加入键重新分区您的输入数据集。例如

enterprises = enterprises.repartition(col("codeCommune"))
cities = cities.repartition(col("codeCommune"))
enterprises.join(cities,col("codeCommune"))