火花RDD上的有序联合

时间:2015-05-21 12:51:20

标签: apache-spark rdd

我正在尝试使用apache spark对密钥记录对的密钥进行排序。密钥长度为10个字节,值大约为90个字节。换句话说,我试图复制用于break the sorting record的Databricks的排序基准。我从文档中注意到的一件事是,它们按键行数对排序,而不是键记录对,可能​​是cache / tlb友好的。我试图复制这种方法,但没有找到合适的解决方案。这是我尝试过的:

var keyValueRDD_1 = input.map(x => (x.substring(0, 10), x.substring(12, 13)))
var keyValueRDD_2 = input.map(x => (x.substring(0, 10), x.substring(14, 98))
var result = keyValueRDD_1.sortByKey(true, 1) // assume partitions = 1
var unionResult = result.union(keyValueRDD_2) 
var finalResult = unionResult.foldByKey("")(_+_)

当我对结果RDD和keyValueRDD_2 RDD进行联合并打印unionResultRDD的输出时,结果和keyValueRDD_2不会交错。换句话说,看起来unionResult RDD具有keyValueRDD_2内容,后跟结果RDD内容。但是,当我执行foldByKey操作,该操作将相同键的值组合到单个键值对中时,排序的顺序将被销毁。我需要通过键操作进行折叠,以便将结果保存为原始的密钥记录对。是否有可用于实现此目的的替代rdd函数?

任何提示或建议都非常有用。 感谢

1 个答案:

答案 0 :(得分:2)

union方法只是将两个RDD一个接一个地放在一起,除非它们具有相同的分区。然后它加入分区。

您想要做的事情是不可能的。

如果您有一个RDD已排序(keyValueRDD_1)而另一个未排序的RDD具有相同的密钥(keyValueRDD_2),那么获得第二个RDD排序的唯一方法是对其进行排序。

排序的RDD的存在无助于我们对第二个RDD进行排序。

Databricks article讨论了执行者本地发生的优化问题。在随机播放步骤之后,对记录进行粗略分类。现在每个分区都覆盖了一系列密钥,但分区未分类。

现在你必须在本地对每个分区进行排序,这就是前缀优化对缓存局部性有帮助的地方。