首页 > 解决方案 > 未分区的大型数据集连接另一个已分区的大型数据集。结果数据集是否分区?

问题描述

在 上Spark,我有一个企业数据集列出了法国的公司。它很大(1 Gb CSV 文件)并且加载时没有分区。

我有另一个数据集:(这些公司的)etablishments,也是一个大文件,它们的位置设置在法国的一个部门。该部门有一个从 01 到 98 的编号,该编号用于划分 etablishments。

当我做enterprise.join(etablishments, joinKey)什么时,结果数据集会变成什么?
- 它是否存储在 etablishment 分区上(这很方便),
- 还是未分区?

如果我做了一个,会一样etablishments.join(enterprise, joinKey)吗?

标签: apache-spark

解决方案


  1. 假设数据帧、数据集而不是 RDD。

  2. 假设从文件中读取。

  3. 假设没有范围分区等。

回答您的问题:生成的数据帧也将以某种方式进行分区,这就是您的答案。它怎么可能不像一般的分区允许并行处理一个 la Spark 范式。

举个简单的例子:

val ds1 = df0.repartition(765)
val ds2 = df0.repartition(765)
sqlContext.setConf("spark.sql.shuffle.partitions", "765")
val joined = ds1.join(ds2, ds1("time_asc") === ds2("time_asc"), "outer") 

默认情况下会发生 JOIN 的散列(如果还没有的话),并创建和处理 765 个填充或空分区。结果输出 DF 也有 765 个分区。

如果您 aggr、join 等并且未设置上述参数,则将应用 Spark 200 默认值,或者根据您的 Spark 会话中最后设置的值。

对于小型广播表,输出的结果分区将等于非广播(较大)表的分区数。

希望这可以帮助。


推荐阅读