2015-05-21 144 views
1

我想对使用apache spark的关键记录对的关键字进行排序。密钥长度为10个字节,值大约为90个字节。换句话说,我试图复制用于break the sorting record的排序基准Databricks。我从文档中注意到的一件事是,他们对键行号对进行了排序,而不是对关键记录对进行排序,以便可能对缓存/ tlb友好。我试图复制这种方法,但还没有找到合适的解决方案。这是我曾尝试:有序的火花RDD联盟

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

您是否试过'RDD.zip'和/或'RDD.zipWithIndex'? –

+0

我对RDD zip的理解是,它会将两个RDD元素的元素明智地压缩。因此,当一个RDD被命令时,另一个RDD不会被排序,并且会导致@daniel指出的相同问题。谢谢。 –

回答

2

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

你想做什么是不可能的。

当你有一个RDD排序(keyValueRDD_1),并使用相同的按键(keyValueRDD_2)然后又无序RDD获得第二个RDD排序是排序的唯一途径。

排序的RDD的存在并不能帮助我们排序第二个RDD。

Databricks article讨论执行者本地发生的优化。在洗牌步骤之后,记录大致分类。现在每个分区都包含一系列密钥,但分区是未分类的。

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

+0

我明白了。是的,这是有道理的。所以,这个前缀优化已经内置在Spark引擎中,或者应该以这种优化被使用的方式进行编码,这是我需要探索的。但是,是的,我明白上述是不可能的,而且我倾向于这样的结果。谢谢@丹尼尔。 –