法国城市数据(会计、企业、工作…(可以方便地按部门(29=Finistère
、33=Gironde
等…(进行分区,在我的数据集中,该字段被命名为codeDepartement
。
我有很多关于这些城市的企业、会计、税务等方面的参考资料,它们在这些部门分区内按codeCommune
排序:enterprises = enterprises.repartition(col("codeDepartement")).sortWithinPartition("codeCommune")
然后,我想加入他们进行分析的时候到了:
-
我有主控
local[12]
配置。 -
我想研究Finistère的城市。这意味着Apache Spark将加载镶木地板文件的
citiescities_part_29
以创建内部RDDcities_rdd_29
或类似的东西,我认为它确实如此。
但是,当连接步骤开始时,即使连接条件为:enterprises.col("codeCommune") = cities.col("codeCommune")
,是否足以确保Spark仅从enterprisesenterprises_part_29
创建内部企业RDDenterprises_rdd_29
,而不会尝试在其他条件之间进行搜索?
-
或者这还不够,我应该为联接条件添加:
enterprises.col("codeDepartement") = cities.col("codeDepartement")
? -
或者,这还不够吗?我应该有一个更明确的公共分区器,它将链接这两个数据集,
然后,如何为数据集创建这样的分区器? -
我在误导别人,我又错过了什么?
由同一个键分区的两个独立引用在连接时只加载它们的公共分区吗?
由联接键分区的两个数据帧将加载到允许本地联接的相同分区中。然而,看起来您已经被除联接列之外的其他列进行了分区,因此将出现shuffle。为了避免这种情况,请在加入之前通过联接键对输入数据集进行重新分区。例如
enterprises = enterprises.repartition(col("codeCommune"))
cities = cities.repartition(col("codeCommune"))
enterprises.join(cities, col("codeCommune"))