如何按多个字段划分数据?

时间:2015-07-30 10:25:58

标签: apache-spark

假设我有一个包含4个标识符变量的记录:var1var2var3var4和另一个变量:var5

我想对其中一个标识符字段中具有相同值的所有记录执行reduce操作。我试着想一想如何用最少量的改组来实现这种解决方案。

是否可以选择告诉Spark将标识符变量中至少有一个匹配项的所有记录放在同一个分区上?我知道有一个自定义分区程序的选项,但我不确定是否可以以支持我的用例的方式实现它。

2 个答案:

答案 0 :(得分:1)

嗯,很大程度上取决于您的数据结构以及您拥有的先验知识。

在最糟糕的情况下,如果您的数据相对密集且分布均匀,并且您执行一次性分析,那么实现目标的唯一方法就是将所有内容放入一个分区。

[1 0 1 0]
[0 1 0 1]
[1 0 0 1] 

显然,这不是一个非常有用的方法。您可以尝试的另一件事是分析至少一部分数据以深入了解其结构,并尝试利用这些知识构建自定义分区程序,以确保同时在集群上实现相对较低的流量和合理的分配。 / p>

作为一般框架,它会尝试其中一种:

散列

  • 选择一定数量的水桶
  • 为每一行创建长度等于桶数的二进制向量
    • 表示连续的每个功能
      • 哈希特征到桶
        • 如果hash(bucket)== 0翻转为1
        • 否则什么都不做
  • 总和计算向量以获取摘要统计
  • 使用您选择的优化技术创建从哈希到分区的函数

频繁项目集

  • 使用其中一种算法,例如apriori,封闭模式,数据样本上的最大模式,FP-growth
  • 计算项目集在样本上的分布
  • 使用优化来计算上面的哈希

这两种解决方案都是计算密集型的,需要大量工作才能实现,因此对于临时分析来说可能不值得大惊小怪,但如果您有可重用的管道,则可能值得尝试。

答案 1 :(得分:1)

这通常不可行。想象一下,X的密钥为(x, x, x, x)Y(y, y, y, y)。没理由把它们放在同一个分区中,对吗?但现在Z带有键(x, x, y, y)。这必须与X位于同一分区中,并且与Y位于同一分区中。这是不可能的。

我建议只是洗牌。创建4个RDD,每个RDD由不同的密钥分隔。