首页 > 解决方案 > 如何减少火花中的输入拆分数量

问题描述

我有一个镶木地板格式的分区 Hive 表。表的每个分区中都有一个 parquet 文件。

使用 Spark 我想从该表中读取数据,执行 mapjoin 并写入另一个表(同一分区)。没有洗牌,这一切都是可能的。我的问题是,在目标表中,我在每个分区中都有多个文件。我认为这是因为 spark 将输入文件分成多个拆分。然后,每次拆分都会在目标表中生成一个文件。

我尝试设置mapreduce.input.fileinputformat.split.minsize大于最大文件大小,但没有任何效果。这是正确的配置吗?我需要在哪里准确设置它?

更新:
好的,希望更清楚我想要什么......
我有两个配置单元表 A 和 B。两者都由同一列分区。我在这里谈论好的旧 Hive 分区。在表 A 中,每个分区只有一个文件。表 B 为空。

使用 Spark,我想从表 A 的多个 Hive 分区加载数据,对小表 C 进行 mapjoin 并将结果加载到表 B 中。

目前我在表 B 的每个分区中获取多个文件。发生这种情况是因为当 Spark 从表 A 中读取文件时,每个文件在 Spark 中被拆分为多个 Dataframe / RDD 分区。然后在单独的任务中处理这些分区中的每一个。然后每个任务产生一个输出文件。

我通常做的是,我按表 B 的分区列重新分区数据帧。这为每个分区提供了一个文件。缺点是,它需要洗牌。

为避免这种情况,我想知道是否有办法让一个 spark 任务来读取和处理每个文件,而不是将其拆分为多个 RDD 分区/任务?

标签: apache-sparkhadoop

解决方案


推荐阅读