我有一个我已播出的列表。我想要执行此过程,以便两个列表的组合将导致RDD
中所有元素的结果列表的大小相同。
diffList
查看lct
键是否具有相应的值。如果是,那么将获取密钥的值,如果不是,则将其元素与givenList
进行比较,并且所有那些不存在的密钥将被赋予值0.0
。
appendList
压缩lctl
和diffList
并应用相关转换。
appendList
应该具有列表中所有元素的相同大小。
当我在本地运行此代码时,它运行正常,然后我具有相同大小的每个列表(在RDD
的每个元素中)。当我在群集上执行相同的操作时,它会为我提供不同大小的列表。
我只是想知道我是否正确地播放了列表,或者逻辑还有其他问题吗?
val w = sqlContext.read.format("org.elasticsearch.spark.sql").load(weeks)
val agg = w.groupBy("id", "type").agg(sum($"d").as("dur"))
val idc = agg.rdd.map(_.toString).map(x => x.replace("[","")).map(x => x.replace("]","")).map(_.split(",")).map(x => (((x(4),(x(2),x(1))),x(3))))
val grp = idc.map(x => (x._1,x._2.toDouble)).reduceByKey(_+_)
val ust = grp.map(x => (x._1._1,(x._1._2,x._2)))
val lct = ust.groupByKey.map(x => (x._1,x._2.toList))
val lctl = lct.map(x => (x._1,x._2.map(y => y._1),x._2.map(y => y._2)))
val givenList = List(("a","z"), ("c","g"), ("c","t"), ("d","h"), ("y","e"), ("f","l"),("g","r"))
val listBroadcast = sc.broadcast(givenList)
val diffList = lct.map(x => x._2.map( y => y._1)).map(x => ((listBroadcast.value.diff(x)),List.fill(listBroadcast.value.diff(x).size)(0.0)))
val appendList = lctl.zip(diffList).map(x => (x._1._1,x._1._2 ++ x._2._1,x._1._3 ++ x._2._2)).map(x => (x._1,x._2 zip x._3))