假设我有一个包含4个标识符变量的记录:var1
,var2
,var3
,var4
和另一个变量:var5
。
我想对其中一个标识符字段中具有相同值的所有记录执行reduce操作。我试着想一想如何用最少量的改组来实现这种解决方案。
是否可以选择告诉Spark将标识符变量中至少有一个匹配项的所有记录放在同一个分区上?我知道有一个自定义分区程序的选项,但我不确定是否可以以支持我的用例的方式实现它。
答案 0 :(得分:1)
嗯,很大程度上取决于您的数据结构以及您拥有的先验知识。
在最糟糕的情况下,如果您的数据相对密集且分布均匀,并且您执行一次性分析,那么实现目标的唯一方法就是将所有内容放入一个分区。
[1 0 1 0]
[0 1 0 1]
[1 0 0 1]
显然,这不是一个非常有用的方法。您可以尝试的另一件事是分析至少一部分数据以深入了解其结构,并尝试利用这些知识构建自定义分区程序,以确保同时在集群上实现相对较低的流量和合理的分配。 / p>
作为一般框架,它会尝试其中一种:
这两种解决方案都是计算密集型的,需要大量工作才能实现,因此对于临时分析来说可能不值得大惊小怪,但如果您有可重用的管道,则可能值得尝试。
答案 1 :(得分:1)
这通常不可行。想象一下,X
的密钥为(x, x, x, x)
,Y
为(y, y, y, y)
。没理由把它们放在同一个分区中,对吗?但现在Z
带有键(x, x, y, y)
。这必须与X
位于同一分区中,并且与Y
位于同一分区中。这是不可能的。
我建议只是洗牌。创建4个RDD,每个RDD由不同的密钥分隔。