繁体   English   中英

当我调用 rdd.join(rdd) 时发生了什么

[英]What is happening when I call rdd.join(rdd)

我正在开发一个应用程序,我需要对 RDD 中具有相同键的每一对行执行计算,这里是 RDD 结构:

List<Tuple2<String, Tuple2<Integer, Integer>>> dat2 = new ArrayList<>();
dat2.add(new Tuple2<String, Tuple2<Integer, Integer>>("Alice", new Tuple2<Integer, Integer>(1, 1)));
dat2.add(new Tuple2<String, Tuple2<Integer, Integer>>("Alice", new Tuple2<Integer, Integer>(2, 5)));
dat2.add(new Tuple2<String, Tuple2<Integer, Integer>>("Alice", new Tuple2<Integer, Integer>(3, 78)));
dat2.add(new Tuple2<String, Tuple2<Integer, Integer>>("Bob", new Tuple2<Integer, Integer>(1, 6)));
dat2.add(new Tuple2<String, Tuple2<Integer, Integer>>("Bob", new Tuple2<Integer, Integer>(2, 11)));
JavaRDD<Tuple2<String, Tuple2<Integer, Integer>>> y2 = sc.parallelize(dat2);

现在,每个人的数据都可以这样查看:(时间戳,值)。 我想知道每行 +-1 时间戳中发生的值的数量。 我知道这看起来像滑动窗口,但我想要事件级粒度

y2.join(y2);
resultOfJoin.filter(t -> t._2()._1()._1() - t._2()._2()._1() <= 1 && t._2()._1()._1() - t._2()._2()._1() >= -1)

在这种情况下,我找到的最佳解决方案是将 RDD 与其自身连接起来,为每个人创建k^2行,其中 k 是与此人关联的行数。

现在,我知道这是一场彻头彻尾的灾难 我知道这会导致洗牌(并且洗牌不好 m'key),但我不能带来更好的东西。

我有3个问题:

  1. 由于我是在join后立即过滤,是否会影响join造成的压力(换句话说,会不会有任何优化)?
  2. 网络上传递的行数是多少? (我知道在最坏的情况下,结果 RDD 将有 n^2 行)在网络上发送的行是 #workers n(仅发送一份副本并在 worker 上复制)还是 #workers n^2(为每个发送行结果工作者的 2 行组合)?
  3. 如果我愿意使用Dataset我可以加入过滤器。 我知道数据集对计算图有额外的优化。 如果我过渡到数据集,我应该期待多少改进(如果有)?

由于我是在join后立即过滤,是否会影响join造成的压力(换句话说,会不会有任何优化)?

不,不会有优化。

网络上传递的行数是多少?

O(N) (特别是每条记录将被洗牌两次,每个父级一次)您通过键加入,因此每个项目都进入一个,并且只有一个分区。

如果我愿意使用 Dataset,我可以加入过滤器。 我知道数据集对计算图有额外的优化。 如果我过渡到数据集,我应该期待多少改进(如果有)?

Shuffle 过程得到了更好的优化,但除此之外,您不能期望任何特定于案例的优化。

希望知道每行 +-1 时间戳中发生的值的数量。

尝试窗口函数:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._

val w = Window.partitionBy("id").ordetBy("timestamp")

rdd.toDF("id", "data")
  .select($"id", $"data._1" as "timestamp", $"data._2" as "value"))
  .withColumn("lead", lead($"value", 1).over(w))
  .withColumn("lag", lag($"value", 1).over(w))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM