使密钥成为PairRDD中的值

时间:2017-10-25 14:05:56

标签: java scala apache-spark rdd

Spark 2.0.1

我有两个班级:

public class Key{
    private Object[] values;
    //a couple of other fields

    public Object[] getKeyFields(){
        return values;
    }
}

public class Value{
    private Object[] values;
    //a couple of other fields

    public Object[] getValues() {
        return values;
    }
}

现在我想对这些字段进行一些操作。

予。

JavaSparcContext sc = //
JavaPairRDD<Key, Value> rdd = sc.newAPIHadoopFile(...);
JavaPairRDD<Key, Object[]> rddArr = rddArr.mapValues(Value::getValues);
JavaPairRDD<String, Object[]> stringKeyRdd = rddArr.mapToPair(p -> {
    return new Tuple2<>(p._1.toString(), p._2)
});
stringKeyRdd.sortByKey()
    .saveAsHadoopFile(...);

并且它的性能非常好。结果如下:enter image description here

II。 但是,如果我尝试使Key - 数组成为JavaPairRDD中的值,我的性能会下降。

JavaSparcContext sc = //
JavaPairRDD<Key, Value> rdd = sc.newAPIHadoopFile(...);
JavaPairRDD<Key, Object[]> rddArr = rddArr.mapValues(Value::getValues);
JavaPairRDD<String, Object[]> stringKeyRdd = rddArr.mapToPair(p -> {
    return new Tuple2<>(p._1.toString(), p._1.getKeyFields()) // <--- Now keys
});
stringKeyRdd.sortByKey()
    .saveAsHadoopFile(...);

结果:

enter image description here

问题: 为什么Shuffle Read和Shuffle Write在这种情况下几乎增加了两倍?

0 个答案:

没有答案