我是刚起步并尝试学习的新手。这是一个非常简单的问题,在这里,我有以下代码将重复的键减少到其值。

数据框将具有这样的值。

 subject      object

  node1        node5
  node1        node6
  node1        node7
  node2        node5
  node2        node7


我希望他们减少这种情况。

 subject      object

  node1        [node5,node6,node7]
  node2        [node5,node7]


我可以使用groupByKey方法实现此目的,但是我想在此处使用reduceByKey,但我无法理解执行此操作的正确语法。

这是我的代码:

    DataFrame records = Service.sqlCtx().sql("SELECT subject,object FROM Graph");


    JavaPairRDD<String,Iterable<String>> rows = records.select("subject","object").toJavaRDD().mapToPair(
            new PairFunction<Row,String,String>(){

                @Override
                public Tuple2<String, String> call(Row row) throws Exception {
                    return new Tuple2<String, String>(row.getString(0), row.getString(1));
                }

            // this can be optimized if we use reduceByKey instead of groupByKey
    }).distinct().groupByKey().cache();

最佳答案

通常情况下,无法使用reduceByKey对其进行优化。效率低下的部分是操作istelf而不是特定的实现。
此外,由于签名不兼容,因此无法直接用reduceByKey实现。可以使用aggregateByKeycombineByKey完成此操作,但这仍然不是优化。
最后,如果您使用DataFrames,请使用collect_list

import static org.apache.spark.sql.functions.*;

records.groupBy("subject").agg(collect_list(col("object")));

09-28 06:08