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

Scala-Spark重新分区未给出预期结果

逑阳泽
2023-03-14

我想根据X列重新划分spark dataframe。假设X列有3个不同的值(X1,X2,X3)。不同值的数量可能会变化。

我希望一个分区包含只有1个X值的记录。也就是说,我想要3个分区,其中1有x=x1的记录,其他的有x=x2,最后一个有x=x3的记录。

val uniqueList = DF.select("X").distinct().map(x => x(0).toString).collect() 

我正在做的重新划分

DF = DF.repartition(uniqueList.length, col('X'))

但是,我在DF中的分区并没有像预期的那样出现。由于一个分区为空,第二个分区包含X1的记录,第三个分区同时包含X2和X3的记录,因此数据不能正确分布。

如果我遗漏了什么,有人能帮忙吗。

DF = DF.repartition(col('X'))

共有1个答案

车明贤
2023-03-14

重新分区基于哈希分区(以分区键的哈希代码为分区数的模),因此每个分区是否只有一个值完全是偶然的。

如果可以将每个分区键映射到一个惟一的int,范围为0到(惟一值的数量-1)之间,因为在Scala中int的哈希代码是这个整数,这将确保如果分区的数量至少与惟一值的数量一样多,那么没有一个分区具有多个不同的分区键值。

也就是说,将值赋给这样的ints本质上是不可并行化的,需要顺序扫描或提前知道不同的值。

概率上,一个特定值散列到(n个分区)的一个特定分区中的几率是1/n。随着n相对于不同值的数量增加,没有一个分区具有一个以上不同值的可能性增加(在极限情况下,如果可以有2^32个分区,几乎所有分区都是空的,但实际的哈希冲突仍然可以保证一个分区中有多个不同值)。因此,如果您可以容忍空分区,那么选择足够多的分区数量,使其大于不同值的数量,将减少出现次理想结果的可能性。

 类似资料:
  • 我正在使用Spring data elasticsearch查询我的elastic文档。我的Elasticsearch实体类: 为了简洁起见,我还做了其他事情,比如设置存储库。数据搜索: Spring为上述调用生成的查询: 查询结果: 查看结果集,检查项目名称字段值,如包含方法!它没有检查完整的给定参数<为什么会这样?如何解决这些问题 Add:organizationId和projectName字

  • 我有一个2.5 GB的数据帧。分区数为5000。我正在尝试重新分区,然后将其持久化。但是在我读取持久化数据之后,分区的数量正在改变。 我甚至尝试使用coalesce,但没有运气。有人能解释一下发生了什么吗?

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

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

  • 动机:我正在设计一个access数据库来跟踪我员工的培训状态。每个员工都有基于其角色的培训要求(例如,行政助理必须接受记录管理培训和电话礼仪,而电工必须接受危险安全培训)。我希望能够生成一份报告,显示每个人所需的所有培训,以及完成的培训课程的完成日期。 模式I有以下表格: 人员——列出员工信息,例如姓名、电话、电子邮件;键: 我创建了一个查询来匹配到他们当前的: 这是正确的,并告诉我每个人当前的培

  • 这是我索引中的文档(也可以有几个): 从逻辑上讲,我试图建立这个条件: 我的问题(来自kibana): 我正在与上述范围内的字段的范围查询与上面的其他字段进行比较。但没有得到任何命中!我想检索具有在给定和日期。 在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?