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

为什么SparkContext.TextFile的分区参数不生效?

封俊艾
2023-03-14
scala> val p=sc.textFile("file:///c:/_home/so-posts.xml", 8) //i've 8 cores
p: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[56] at textFile at <console>:21

scala> p.partitions.size
res33: Int = 729
scala> p1 = p.repartition(8)
scala> p1.partitions.size
res60: Int = 8
scala> p1.count

共有1个答案

金珂
2023-03-14

@zero323确定了这一点,但我想我应该添加更多的(低级)背景知识,说明这个minPartitions输入参数是如何影响分区数量的。

tl;dr partition参数确实对sparkcontext.textfile的最小值有影响(不完全正确!)分区数。

在这种使用sparkcontext.textfile的特殊情况下,分区数由textfile使用的org.apache.hadoop.mapred.textInputFormat.getsplits(jobConf,minPartitions)直接计算。TextInputFormat只知道如何使用Spark对分布式数据进行分区(也就是拆分),只遵循建议。

FileInputFormat是所有基于文件的InputFormat的基类。这提供了getSplits(JobConf,int)的通用实现。FileInputFormat的子类还可以重写isSplitable(FileSystem,Path)方法,以确保输入文件不会被拆分,并由映射器作为一个整体进行处理。

这是Spark如何利用Hadoop API的一个很好的例子。

顺便说一句,你可能会发现这些来源很有启发性;-)

 类似资料:
  • 我的问题是,当没有密钥时,Spark如何重新分区?我无法进一步深入源代码,以找到它通过Spark本身的位置。 例如:调用这些行完全可以,但我不知道它实际上在做什么。是整行的散列吗?也许是DataFrame中的第一列?

  • 问题内容: 我有一个配置单元表,该配置表按年,月,日和小时划分。我需要对其执行查询以获取最近7天的数据。这是在。我的查询当前看起来像这样: 这需要很长时间。当我用上面的实际数字代替时,请说: 它会在几分钟内完成。有什么办法可以更改上面的脚本,以便实际上只包含查询中的数字而不是函数? 我尝试使用像: 但这不能解决问题。 问题答案: 解决方案 原始查询出了什么问题? unix_timestamp()

  • 问题内容: 我正在使用以下代码(尝试)查询数据库: 其中clientRequest [0]来自字符串数组,服务变量是POJO中的字符串,映射到MySQL数据库中的VARCHAR(45)。 当我运行此代码时,Hibernate将执行的SQL查询显示为: 这使我相信clientRequest [0]的值未正确设置为参数。 我检查了clientRequest [0]包含一个有效的String,它确实这样

  • 我的脚本将,作为参数: 但当我将它作为分隔符传递时,它是空的 我知道在参数/参数解析中很特殊,但我以和引用的形式使用它。 为什么它不起作用?我使用的是Python 3.7.3 这是测试代码: 当我运行它作为它打印空。

  • 定义参数化类时,只能使用固定数量的参数。 但是,如果你想创建一个包含多个值的地图。必须使用映射

  • 谁能告诉我为什么函数参数不能是?这是函数参数在上声明并在函数返回时被取消分配的原因吗?没有办法保留参数值?只是糊涂了。请澄清。 多谢了。