【spark2】【源码学习】【分区数】spark读取 本地/可分割/多个 的文件时是如何划分分区

spark的textFile API 支持读取单个文件,也支持读取文件夹路径并将文件夹路径下的文件都读取进内存处理,前面已经写了一篇关于 【本地/可分割/单个】 文件的分区处理,今天来看下 【本地/可分割/多个】 文件是怎么处理的。

一、简要概述

1、goalSize从单个文件totalSize/minPartitions变成多个文件totalSize/minPartitions,
2、然后依旧是通过goalSize,minSize,blockSize计算出splitSize,
3、最后将splitSize单独应用到每个文件上面,将所有分区加起来就是最后得到的总分区了。

二、分区过程

2.1、读取文件

这里可以看到spark将文件夹下的文件路径都拿到了,并且计算出了所有文件夹的totalSize

在这里插入图片描述

2.2、分割文件,记录切片信息

通过goalSize,minSize,blockSize计算出splitSize
最后将splitSize单独应用到每个文件上面, 使用for外层的一个list来记录所有切片信息

### Spark 读取多个分区数据的方法及实现方式 在 Spark 中,可以通过多种方法来读取并操作分布在分区中的数据。以下是具体说明: #### 方法一:通过 `textFile` 设置自定义分区数 当使用 `sc.textFile(path, minPartitions)` 方法,可以指定最小的分区数量 `minPartitions` 来控制文件划分为多少个分区[^4]。如果未设置该参数,则默认会根据 HDFS 块大小或者本地文件系统的配置自动计算分区数目。 示例代码如下: ```scala val conf: SparkConf = new SparkConf().setMaster("local").setAppName("wordcount") val sc: SparkContext = new SparkContext(conf) // 将输入文件按照两个分区加载到 RDD 中 val rdd: RDD[String] = sc.textFile("datas/1.txt", 2) rdd.saveAsTextFile("output") ``` #### 方法二:利用 `wholeTextFiles` 处理多文件场景 对于需要一次性读取目录下所有文件的情况,推荐使用 `wholeTextFiles()` 函数。它仅能够返回每条记录的内容字符串,还会附加对应的文件名作为键值对形式存储于 RDD 当中[^2]。 下面是一个简单的例子展示其用法: ```scala val fileRdd: RDD[(String, String)] = sc.wholeTextFiles("/path/to/directory/") fileRdd.foreach { case (fileName, content) => println(s"FileName:$fileName\nContent:\n$content") } ``` #### 方法三:基于 HashPartitioner 自动分发数据至各 Partition 假如应用层面希望手动干预如何把 Key 映射到特定的 Partition 上去的话,那么就可以采用类似于这样的逻辑表达式来进行定制化设计——即 partition index 计算公式为 `(key.hashCode() % numPartitions)`[^1] 。此策略广泛应用于诸如 Join 或 GroupByKey 这样的 Transformation 操作之中。 需要注意的是,在实际开发过程中应当充分考虑业务需求以及性能调优等因素后再决定采取何种具体的方案实施。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值