当前位置: 首页 > 知识库问答 >
问题:

Spark 写入磁盘,其中 N 个文件少于 N 个分区

暴奕
2023-03-14

我们可以将数据写入100个文件,每个文件有10个分区吗?

我知道我们可以使用重新分区或合并来减少分区数量。但是我已经看到一些 hadoop 生成的 avro 数据,其分区数比文件数量多得多。

共有1个答案

刘和正
2023-03-14

写出的文件数量由数据帧或RDD的并行化控制。因此,如果您的数据被拆分为 10 个 Spark 分区,则在不减少分区(例如合并或重新分区)的情况下,您不能写入少于 10 个文件。

现在,已经说过,当数据读回时,可以根据配置的拆分大小将其拆分为更小的块,但这取决于格式和/或压缩。

相反,如果您希望增加每个Spark分区写入的文件数量(例如,防止文件过大),Spark 2.2会在您写出数据时引入一个< code>maxRecordsPerFile选项。这样,您可以限制每个分区中每个文件写入的记录数。另一个选择当然是重新分配。

以下将导致写出2个文件,即使它只有1个分区:

val df = spark.range(100).coalesce(1)
df.write.option("maxRecordsPerFile", 50).save("/tmp/foo")
 类似资料:
  • 问题内容: 我目前正在实施ping / pong缓冲方案,以安全地将文件写入磁盘。我在Linux / CentOS计算机上使用C ++ / Boost。现在,我面临的问题是强制将文件实际写入磁盘。不管文件系统的所有缓存策略(ext3 / ext4)/ SO自定义规则/ RAID控制器/硬盘控制器如何,都可以这样做吗? 最好使用普通的fread()/ fwrite(),c ++ ostream或bo

  • 我试图学习分布式计算,并遇到了一个寻找大量数字的中位数的问题: 假设我们有一大组数字(假设元素数为 N*K),它们无法放入内存(大小为 N)。我们如何找到这些数据的中位数?假设在内存上执行的操作是独立的,即我们可以考虑有K台机器,每台机器最多可以处理N个元素。 我认为中位数可以用于这个目的。我们可以一次将N个数装入内存。我们在< code>O(logN)时间内找到该集合的中值,并保存它。 然后我们

  • 问题内容: 问题很多,但我似乎找不到与我遇到的情况相匹配的问题。我想在前n个查询中执行一些分组。我的数据看起来像这样(显然是假值)。 该表的日期范围涵盖数月,每月有数千行。我想做的是一个查询,告诉我哪个IP地址出现在每个月中最频繁。我可以使用以下方法完成一个月的操作: 但是我真正想要的是能够看到数据集中每个月的前n个。从本质上讲,这禁止了我使用我指定的where子句。当然,当我这样做的时候,我在所

  • 问题概要:假设我有300 GB的数据正在AWS中的EMR集群上用火花处理。这些数据有三个属性,用于在Hive中使用的文件系统上进行分区:日期、小时和(比方说)另一个。我想以最小化写入文件数量的方式将此数据写入fs。 我现在正在做的是获取日期、小时、另一个时间的不同组合,以及有多少行构成组合的计数。我将它们收集到驱动程序上的列表中,并遍历列表,为每个组合构建一个新的DataFrame,使用行数重新分