我是刚起步并尝试学习的新手。这是一个非常简单的问题,在这里,我有以下代码将重复的键减少到其值。
数据框将具有这样的值。
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
实现。可以使用aggregateByKey
或combineByKey
完成此操作,但这仍然不是优化。
最后,如果您使用DataFrames
,请使用collect_list
:
import static org.apache.spark.sql.functions.*;
records.groupBy("subject").agg(collect_list(col("object")));