apache-spark - 未分区的大型数据集连接另一个已分区的大型数据集。结果数据集是否分区?
问题描述
在 上Spark
,我有一个企业数据集列出了法国的公司。它很大(1 Gb CSV 文件)并且加载时没有分区。
我有另一个数据集:(这些公司的)etablishments,也是一个大文件,它们的位置设置在法国的一个部门。该部门有一个从 01 到 98 的编号,该编号用于划分 etablishments。
当我做enterprise.join(etablishments, joinKey)
什么时,结果数据集会变成什么?
- 它是否存储在 etablishment 分区上(这很方便),
- 还是未分区?
如果我做了一个,会一样etablishments.join(enterprise, joinKey)
吗?
解决方案
假设数据帧、数据集而不是 RDD。
假设从文件中读取。
假设没有范围分区等。
回答您的问题:生成的数据帧也将以某种方式进行分区,这就是您的答案。它怎么可能不像一般的分区允许并行处理一个 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 会话中最后设置的值。
对于小型广播表,输出的结果分区将等于非广播(较大)表的分区数。
希望这可以帮助。
推荐阅读
- c# - 为什么编译器会在 switch 中添加语句?
- c - 从旧的 init_timer 适应新的 timer_setup
- vaadin - Vaadin 12:将 innerHTML 2x 设置为相同的值不起作用
- rpm - Percona 安装失败
- codeigniter - 如何在 Codeigniter 中以希伯来语输出文件名?
- javascript - 防止 URL 泄漏给 wordpress 中的免费会员
- .net-core - 使用 EF Core 2.2 播种变量数据
- python - 有没有办法检查一个人是否在没有正则表达式的情况下输入了有效的电子邮件 - python
- c# - 使用 C# 取消选中所有复选框
- validation - 在 Ubuntu 操作系统上从 3.8.7 升级开源 Puppet