为自定义RDD

时间:2015-05-27 04:55:12

标签: java apache-spark

JDBCRDD可能已进行分区,以便在数据库上进行高效的查询并行化。

有没有办法将如何数据分区作为下一阶段的有用提示,可能是groupBy,而不必重新分配数据?

示例:我正在加载日期/区域/值。使用JDBCRDD我正在加载按日期分区的数据。如果我想减少/ groupBy日期和区域,我不应该再对日期进行排序和改组,并利用RDD已按日期分区的事实。

在伪API中,我会做如下的事情:

RDD rdd = new JDCBCRDD ...
Partitioner partitioning = (Row r)->p(r)
rdd.assertPartitioning(partitioning);
RDD<Pair<Key,Row>> rdd2 = rdd.groupWithinPartition((r)->f(r),Rowoperator::sum);

所以现在理论上,我的所有分组都要执行JVM实例本地,同一节点,相同的JVM,相同的线程。

2 个答案:

答案 0 :(得分:1)

如果您的意思是需要保留每个元素的分区索引的信息,我认为mapWith就是您所需要的。您可以将分区索引与数据分组到一个新类中,然后传递到下一个阶段。

答案 1 :(得分:0)

分区由RDD中元素的哈希值控制。为了避免进入下一阶段的混乱,您基本上需要保证生成相同的哈希值。您可以通过覆盖hashCode方法来完成此操作。