我是新手,想要学习。这是一个简单的问题,我在下面的代码中将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();
答案 0 :(得分:1)
reduceByKey
优化此功能。低效的部分是操作istelf而不是特定的实现。reduceByKey
实现此功能。这可以通过aggregateByKey
或combineByKey
完成,但仍然不是优化。最后,如果您使用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)))