![](/img/trans.png)
[英]Sorting an RDD in Apache Spark using mapPartitions and reduce
[英]Sorting an rdd after using groupbykey using values
我有JavaPairRDD
作為
JavaPairRDD<String, Iterable<Row>> rdd = mydataset.orderBy("orderfield1", "orderfield2").javaRDD().mapToPair(row -> new Tuple2<>(row.getAs("id").toString(), row)).groupByKey()
由於groupbykey()
不維護訂單, orderby
在這里不起作用。 我想使用數據集中的一些字段對Iterable<Row>
進行排序。
您可以將Iterable
轉換為List
,然后像下面那樣對該列表進行排序。 我假設您的排序字段稱為x
並且它是 String 類型,但您顯然可以根據您的具體情況進行調整。
String sortingField = "x"
JavaPairRDD<String, List<Row>> rdd = mydataset
.javaRDD()
.mapToPair(row -> new Tuple2<>(row.getAs("id").toString(), row))
.groupByKey()
.mapValues(it -> {
List<Row> rows = new ArrayList<>();
it.forEach(rows::add);
rows.sort(
(Row a, Row b) -> a.<String>getAs(sortingField).compareTo(b.<String>getAs(sortingField))
);
return rows;
});
請注意,在 scala 中這樣寫起來要簡單得多:
val rdd = mydataset
.rdd
.map(row => (row.getAs("id").toString, row))
.groupByKey
.mapValues( _.toSeq.sortBy(_.getAs[String]("x")))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.