Apache spark 如何在同一执行器上分割Spark中的分区?(与合并相反)

Apache spark 如何在同一执行器上分割Spark中的分区?(与合并相反),apache-spark,Apache Spark,例如,有没有什么方法可以在不通过网络和洗牌的情况下分割Spark分区 # p stands for partition machine 1: p1: 1,2 p2: 3,4 machine 2: p3: 5,6 p4: 7,8 我想要的是 machine 1: p1:1, p2:2, p3:3, p4:4 machine 2: p5:5, p6:6, p7:7, p8:8 有没有办法做到这一点?(我认为这里没有网络传输和洗牌) 附言: 这与coalesce相反,如果我调用coalesce(

例如,有没有什么方法可以在不通过网络和洗牌的情况下分割Spark分区

# p stands for partition
machine 1:
p1: 1,2 p2: 3,4
machine 2:
p3: 5,6 p4: 7,8
我想要的是

machine 1: 
p1:1, p2:2, p3:3, p4:4
machine 2:
p5:5, p6:6, p7:7, p8:8
有没有办法做到这一点?(我认为这里没有网络传输和洗牌)

附言:

这与
coalesce
相反,如果我调用
coalesce(2)
,那么我想应该是这样

machine 1: p1: 1,2,3,4 machine 2: p2: 5,6,7,8

如果数据不通过网络传输,并且不会调用无序排列,并且
coalesce(1)
将导致网络传输,因为机器2中的数据都会传输到机器1?

如果应用程序代码是以某种方式编写的,则
重新分区
API可以提供帮助

  • 读取数据集并使用列
    a
    重新分区。这将导致整个网络的混乱,这意味着为
    a
    的每个唯一值创建一个分区

  • 一旦完成第1步,如果现在对列
    a
    b
    上的数据集进行重新分区,这将导致以最小的混乱创建新分区


  • 您可以在这里阅读有关散列分区器的更多信息-

    我认为您的步骤2基于具有相同密钥的分区。因此,您首先需要在步骤1中执行类似于
    groupbyKey
    的操作?有没有什么方法可以在不考虑任何键的情况下进行拆分,而不会导致任何洗牌。如果没有网络洗牌,就不可能创建多个新分区。我认为从理论上讲,进行此操作是有意义的。是的,有一些选项,如将
    spark.sql.shuffle.partitions
    设置为更高的值。此外,还提供了
    COALESCE
    选项来处理从目录中读取许多小文件或应用大量过滤器的情况,更多详细信息请参见-。如果这个答案有帮助,请不要忘记接受答案。