如何在Apache Spark中执行简单的reduceByKey?

时间:2017-01-23 13:39:04

标签: java apache-spark

我是新手,想要学习。这是一个简单的问题,我在下面的代码中将w.r.t的重复键减少到它们的值。

数据框将具有如下值。

 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();

2 个答案:

答案 0 :(得分:1)

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

    import static org.apache.spark.sql.functions.*;
    
    records.groupBy("subject").agg(collect_list(col("object")));
    

答案 1 :(得分:-1)

有一种方法可以将reduceByKey应用于优化,但我们必须在reduceByKey之前进行1次转换。

if content == 'A':
    varP1f.set(0)
    varP1ind.set(12)
    varP1d.set(1)

然后应用&#39; ++ &#39; with reduceByKey。

输出:

  

<强>阶&GT; reducedKV.collect

     

Array [(String,Seq [String])] = Array((node2,List(node5,node7)),(node1,List(node5,node6,node7)))