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

Spark DataFrame重新分区:未保留的分区数

侯兴为
2023-03-14

根据Spark 1.6.3的文档,重新分区(partitionexprs:column*)应该保留结果数据表中的分区数:

返回由给定分区表达式分区的新DataFrame,保留现有的分区数

val sc = new SparkContext(new SparkConf().setAppName("Demo").setMaster("local[4]"))
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._

val myDF = sc.parallelize(Seq(1,1,2,2,3,3)).toDF("x")
myDF.rdd.getNumPartitions // 4 
myDF.repartition($"x").rdd.getNumPartitions //  200 !

Edit:这个问题并不涉及在Apache Spark中删除空DataFrame分区的问题(例如,如何在不产生空分区的情况下沿列重新分区),而是为什么文档所说的内容与我在示例中观察到的内容不同

共有1个答案

呼延才俊
2023-03-14

这是与钨项目有关的东西,在Spark中启用了。它使用硬件优化并调用哈希分区,从而触发洗牌操作。默认情况下,spark.sql.shuffle.partitions设置为200。在重新分区之前和刚刚调用之后,可以通过在数据文件中调用explain来验证:

myDF.explain

val repartitionedDF = myDF.repartition($"x")

repartitionedDF.explain
 类似资料:
  • 我在这里浏览了文档:https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html 它说: 重新分区:生成的DataFrame是哈希分区的 对于repartitionByRange:结果DataFrame是范围分区的 而且之前的一个问题也提到了。然而,我仍然不明白它们到底有什么不同,当选择一个而不是另一个时会有什么

  • 当使用外部配置单元表时,是否有一种方法可以删除目录中的数据,但通过查询保留分区。请注意,我不想删除表并重新创建它。我只想清空底层文件夹并重新启动一个进程。我的表很大,按年、月、日期和小时划分分区,手动重新创建分区需要大量时间。 谢谢

  • 假设我有一个1.2 GB的文件,那么考虑到128 MB的块大小,它将创建10个分区。现在,如果我将其重新分区(或合并)为4个分区,这意味着每个分区肯定会超过128 MB。在这种情况下,每个分区必须容纳320 MB的数据,但块大小是128 MB。我有点糊涂了。这怎么可能?我们如何创建一个大于块大小的分区?

  • 作为卡桑德拉数据分区的后续,我得到了vNodes的想法。感谢“西蒙·丰塔纳·奥斯卡森” 当我尝试使用vNodes进行数据分区时,我有几个问题, 我尝试观察2节点中的分区分布() 因此,根据我在两个节点中的观察,随着一个范围的扩展,节点61的值从-9207297847862311651到-9185516104965672922。。。 注意:分区范围从9039572936575206977到90199

  • 既然这样,为什么还会有人使用重新分区呢?我想我唯一能看到它被使用的时候是如果我没有使用PairRDD,或者我有很大的数据偏差? 我是否遗漏了什么,或者有人能从不同的角度为我照亮吗?

  • 我的Kafka Streams应用程序正在使用以下键值布局的kafka主题: