Spark RDD 上的有序联合

Ordered union on spark RDDs

我正在尝试使用 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 函数?

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

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

你想做什么是不可能的

当你有一个已排序的 RDD (keyValueRDD_1) 和另一个未排序的具有相同键的 RDD (keyValueRDD_2) 时,让第二个 RDD 排序的唯一方法是对其进行排序。

排序后的RDD的存在并不能帮助我们对第二个RDD进行排序

Databricks article 讨论了执行器本地发生的优化。在洗牌步骤之后,记录被粗略地排序。现在每个分区都包含一系列键,但分区未排序。

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