Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用Sparks reduceByKey转换值类_Apache Spark_Distributed Computing - Fatal编程技术网

Apache spark 使用Sparks reduceByKey转换值类

Apache spark 使用Sparks reduceByKey转换值类,apache-spark,distributed-computing,Apache Spark,Distributed Computing,我有一个名为“DataClass”的大型类,包括以下成员:“time”、“value”、“type”、“name”、“family”。 这些文件分发如下: JavaPairRDD<key, DataClass> distributedRDD; javapairdd distributedd; 目前,我所做的是按照以下方式将所有这些信息分组: JavaPairRDD<key, List<DataClass>> distributedRDD.groupByKe

我有一个名为“DataClass”的大型类,包括以下成员:“time”、“value”、“type”、“name”、“family”。 这些文件分发如下:

JavaPairRDD<key, DataClass> distributedRDD;
javapairdd distributedd;
目前,我所做的是按照以下方式将所有这些信息分组:

JavaPairRDD<key, List<DataClass>> distributedRDD.groupByKey();
javapairdd distributedd.groupByKey();
我目前只需要使用这个大型“数据类”的两个成员,即:“时间”和“值”。 为了提高性能,我希望避免洗牌这种大数据类型,也许可以尝试只对所需的成员执行洗牌

我想到的一件事是以某种方式使用reduceByKey,以便将值从“DataClass”减少到“SmallDataClass”(仅包括所需的成员),并在较小的类上进行洗牌


是否有人可以帮助执行此任务?

最简单的方法是在应用组操作之前将初始RDD转换为所需的形式:

val timeValueRdd = rdd.map{case (k,v) => (k,(v.time, v.value))}
val grouped = timeValueRdd.groupByKey
使用
aggregateByKey
有一个稍微复杂一点的选项,效率更高:

val grouped = rdd.aggregateByKey(List[(String,String)].empty)({case (list,elem) => (elem.time,elem.value)::list}, (list1, list2) => list1 ++ list2)

aggregateByKey
的工作原理类似于地图侧的
fold
,并使用reduce函数(如按键reduce)将每个分区的结果合并为一个分区。

@user3370773当然!只是更详细:也许这个答案会对你有所帮助。在Scala中,但逻辑是相同的。