apache-spark - 如何减少火花中的输入拆分数量
问题描述
我有一个镶木地板格式的分区 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 分区/任务?
解决方案
推荐阅读
- git - docker 中的 Jenkins 和本地 git repo - 不注册对 Jenkinsfile 的更改
- javascript - 在单独的下拉单击事件中更新一个函数中的对象值
- c++ - 如何让旧版本的 clang 对 atomic 的默认异常规范感到满意
- ios - 如何在 iPad (SwiftUI) 上以 2/3 拆分视图显示不同的布局
- html - 为什么我设法以百分比设置 div 的大小?
- database - 寻找查询
- c# - 如何使用 C# NEST 在 ElasticSearch 中搜索数组的动态元素?
- java - Spring:嵌套对象不会反序列化
- mysql - 将 SQL 中的单行转换为列
- asp.net-mvc - 如何在 .NET 4.7 和 .NET 5 应用程序中使用相同的用户