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

Spark -如何在列的基础上以最小的混乱重新划分数据帧?

茹康裕
2023-03-14

我们有多个数据帧。

其中一个数据帧是主数据帧,它使用左-外联接与其他数据帧联接。所有这些数据帧都联接到 4 列(例如 col1、col2、col3、col4)。

为了减少数据混乱,目前我们正在重新划分4个连接列上的所有数据帧,然后连接这些数据帧(左外)。

有没有更好的方法来连接/重新划分这些数据帧,从而使数据的混乱最小化?

谢谢

共有2个答案

南门鸿畴
2023-03-14

我的帖子回复晚了。我们最终使用了广播。

我们从两个数据帧中删除了重新分区,并广播了较小的数据帧。

胡高寒
2023-03-14

重新划分不会避免洗牌,它会优化连接。如果您的两个数据帧都很大,并且不够小,无法容纳广播哈希连接的内存。您可以将数据帧保存为bucketed表,然后执行排序合并连接。通过这种方式,您可以跳过排序阶段的洗牌,这通常发生在连接两个大数据帧之前。请参阅Spark join*without*shuffle下面的链接。只有当您必须多次连接同一个数据帧时,此技术才有用。因为将这些表打包也会给Spark应用程序带来一些开销。

 类似资料:
  • 我有一个数据帧,它有500个分区,并且被洗牌。我想根据“城市”一栏重新划分,但城市一栏非常歪斜,因为它只有三个可能的值。所以当我重新分区​ 基于列城市,即使我指定了500个分区,也只有三个分区在获取数据。因此,我遇到了性能问题。我在网上搜索,但找不到任何合适的解决方案。是否有一种方法可以跨基于city列的分区均匀地重新划分数据帧。我需要的是:city1表示前5个分区,city2表示后490个分区,

  • 我有以下名为“生产”的熊猫数据框架,并希望根据其种类、温室和年/月获得每种植物生产的重量 例如,对于“2020-05”,我们有GH1和GH2。在GH1中,S1(工厂0001和0002)的总产量为400(200),因此工厂0001的重量为0.50,工厂0002的重量为0.50。S2的总产量为150(100 50);因此,我们将植物0003的重量定为0.66(100/150),将植物0004的重量定为

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

  • 在减少分区数量时,可以使用coalesce,这很好,因为它不会引起混乱,而且似乎可以立即工作(不需要额外的作业阶段)。 有时我想做相反的事情,但重新分区会导致混乱。我想几个月前,我实际上通过使用balanceSlack=1.0的CoalescedRDD实现了这一点-所以会发生的是,它会分割一个分区,从而得到所有分区都位于同一节点上的分区位置(如此小的网络IO)。 这种功能在Hadoop中是自动的,

  • 我有两对结构为rdd[String,Int]的RDD,称为rdd1和rdd2。 如果我加入前面的RDD,并在结果RDD(mapValues)的值上执行一个函数,那么所有的工作都将在一个worker中完成,而不是在集群的不同worker节点上分配不同的任务。我的意思是,期望的行为应该是在集群允许的这么多节点中并行执行作为参数传递给mapValues方法的函数。

  • 我想将数据帧“df1”划分为3列。此数据帧正好有990个针对这3列的唯一组合: 为了优化这个数据帧的处理,我想对df1进行分区,以获得990个分区,每个分区对应一个密钥: 我写了一个简单的方法来计算每个分区中的行数: 我注意到,实际上我得到的是628个带有一个或多个键值的分区,以及362个空分区。 我假设spark会以一种均匀的方式(1个键值=1个分区)重新分区,但这似乎不是这样,我觉得这种重新分