在读取目录时,我无法理解sc.textfile("directory")
是如何进行分区的。
我有一个包含10个文件的目录。
rdd1 = sc.textFile("/path/*")
如果我在路径目录下有10个文件,则默认情况下会创建10个分区,但是当我将第二个参数设置为11时,我会得到分区号20,而当传递21时,我会得到30分区可以帮助我了解第二个参数的值
答案 0 :(得分:0)
Spark将这项工作委托给Hadoop的InputFormat.getSplits(int numSplits)
,更确切地说,是TextInputFormat
。
其中numSplits
参数只是一个提示。甚至spark都将此参数称为minPartitions
现在它取决于输入文件格式,例如
是否压缩?
如果是,请检查压缩编解码器是否可拆分。
然后使用以下逻辑:
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
long minSize = Math.max(job.getLong(FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize)
...
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);
之后,Spark会过滤所有零尺寸的分割
allInputSplits.filter(_.getLength > 0)
并按拆分创建分区
new HadoopPartition(id, i, inputSplits(i))
答案 1 :(得分:0)
Spark将这项工作委托给Hadoop的InputFormat.getSplits(int numSplits)
,更确切地说,是TextInputFormat
。
其中numSplits参数只是一个提示。甚至spark都将此参数称为minPartitions
现在它取决于输入文件格式,例如是否压缩? 如果是,请检查压缩编解码器是否可拆分。 然后使用以下逻辑:
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
long minSize = Math.max(job.getLong(FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize)
...
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);
之后,Spark会过滤所有零尺寸的分割
allInputSplits.filter(_.getLength > 0)
并按拆分创建分区
new HadoopPartition(id, i, inputSplits(i))
在computeSplitSize
中,返回最大值minSize
或最小值(blockSize
或goalSize
)
protected long computeSplitSize(long goalSize, long minSize,
long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}