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

在从cassandra源读取数据的同时,在spark中重新分区会改变spark分区的数量吗?

姜嘉赐
2023-03-14

我的假设是,首先,spark会从cassandra读取数据,因此在这个阶段,cassandra的大分区不会因为重新分区而分裂。重新分区将对从Cassandra加载的基础数据起作用。

我只是想知道答案,当从spark读取数据时,重新分区是否会改变数据分布,而不是再次进行分区?

共有1个答案

司马振国
2023-03-14

如果您使用某个任意键重新划分数据,那么是的,它将在Spark分区之间重新分配。

从技术上讲,当您检索数据时,Cassandra分区不会被分割成Spark分区,但是一旦您完成了读取,您可以在不同的键上重新分区,以分割一个大的Cassandra分区的行。

首先,它并没有避免读取大型Cassandra分区的内存问题,因为64MB的默认输入分割大小只是Spark根据估计的Cassandra表大小和C*分区大小计算需要多少Spark分区的一个名义目标。但是由于计算是基于估计的,所以Spark分区实际上并没有达到64MB的大小。

对于第一个Spark分区,令牌范围可能只包含大小分别为3MB和15MB的两个Cassandra分区,因此Sthe park分区中数据的实际大小仅为18MB。

但在下一个Spark分区中,令牌范围包含28个Cassandra分区,大部分为1到4MB,但有一个分区为56MB。这个Spark分区的总大小最终超过64MB。

在这两种情况下,一个Spark分区的大小仅为18MB,而另一个则大于64MB的目标大小。我在这篇文章中更详细地解释了这个问题--https://community.datastax.com/questions/11565/.干杯!

 类似资料:
  • 当我使用Spark从S3读取多个文件时(例如,一个包含许多Parquet文件的目录)- 逻辑分区是在开始时发生,然后每个执行器直接下载数据(在worker节点上)吗?< br >还是驱动程序下载数据(部分或全部),然后进行分区并将数据发送给执行器? 此外,分区是否默认为用于写入的相同分区(即每个文件= 1个分区)?

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

  • 我需要从一个Hive表中读取数据并将其插入到另一个Hive表中。两个表的架构是相同的。该表按日期分区 步骤1:从Spark的源表中读取数据。 第 2 步:按列(国家、日期)和分区数重新分区为 4。 我只得到每个国家代码1个分区

  • 根据Spark 1.6.3的文档,应该保留结果数据表中的分区数: 返回由给定分区表达式分区的新DataFrame,保留现有的分区数 Edit:这个问题并不涉及在Apache Spark中删除空DataFrame分区的问题(例如,如何在不产生空分区的情况下沿列重新分区),而是为什么文档所说的内容与我在示例中观察到的内容不同

  • 我在集群模式下运行火花,并通过JDBC从RDBMS读取数据。 根据 Spark 文档,这些分区参数描述了从多个工作线程并行读取时如何对表进行分区: 这些是可选参数。 如果我不指定这些,会发生什么情况: < li >只有一名工人读取全部数据? < li >如果它仍然并行读取,它如何对数据进行分区?

  • 有人能解释一下将为Spark Dataframe创建的分区数量吗。 我知道对于RDD,在创建它时,我们可以提到如下分区的数量。 但是对于创建时的Spark数据帧,看起来我们没有像RDD那样指定分区数量的选项。 我认为唯一的可能性是,在创建数据帧后,我们可以使用重新分区API。 有人能告诉我在创建数据帧时,我们是否可以指定分区的数量。