我正在尝试使用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函数?
任何提示或建议都非常有用。 感谢
答案 0 :(得分:2)
union
方法只是将两个RDD一个接一个地放在一起,除非它们具有相同的分区。然后它加入分区。
您想要做的事情是不可能的。
如果您有一个RDD已排序(keyValueRDD_1
)而另一个未排序的RDD具有相同的密钥(keyValueRDD_2
),那么获得第二个RDD排序的唯一方法是对其进行排序。
排序的RDD的存在无助于我们对第二个RDD进行排序。
Databricks article讨论了执行者本地发生的优化问题。在随机播放步骤之后,对记录进行粗略分类。现在每个分区都覆盖了一系列密钥,但分区未分类。
现在你必须在本地对每个分区进行排序,这就是前缀优化对缓存局部性有帮助的地方。