【发布时间】:2015-05-21 12:51:20
【问题描述】:
我正在尝试使用 apache spark 对键记录对的键进行排序。键长 10 字节,值长约 90 字节。换句话说,我正在尝试复制用于break the sorting record 的排序基准 Databricks。我从文档中注意到的一件事是,它们对键行号对进行排序,而不是键记录对,可能对缓存/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 函数?
任何提示或建议都会非常有用。 谢谢
【问题讨论】:
-
你试过
RDD.zip和/或RDD.zipWithIndex吗? -
我对 RDD zip 的理解是它会明智地压缩两个 RDD 元素的元素。因此,虽然订购了一个 RDD,但未订购另一个 RDD,这将导致@daniel 指出的相同问题。谢谢。
标签: apache-spark rdd