运行

时间:2017-10-22 09:31:38

标签: scala apache-spark emr amazon-emr

当我在EMR上运行我的spark作业(版本2.1.1)时,每次运行会在数据帧上计算不同的行数。我首先从s3读取数据到4个不同的数据帧,这些计数总是一致的,然后在加入数据帧之后,连接的结果具有不同的计数。之后我也会过滤结果,每次运行时也有不同的计数。变化很小,1-5行差异,但它仍然是我想要理解的东西。

这是加入的代码:

val impJoinKey = Seq("iid", "globalVisitorKey", "date")

val impressionsJoined: DataFrame = impressionDsNoDuplicates
  .join(realUrlDSwithDatenoDuplicates, impJoinKey, "outer")
  .join(impressionParamterDSwithDateNoDuplicates, impJoinKey, "left")
  .join(chartSiteInstance, impJoinKey, "left")
  .withColumn("timestamp", coalesce($"timestampImp", $"timestampReal", $"timestampParam"))
  .withColumn("url", coalesce($"realUrl", $"url"))

这是针对过滤器的:

val impressionsJoined: Dataset[ImpressionJoined] = impressionsJoinedFullDay.where($"timestamp".geq(new Timestamp(start.getMillis))).cache()

我也尝试过使用filter方法而不是where,但结果相同

有什么想法吗?

由于 尼尔

1 个答案:

答案 0 :(得分:0)

其中一个数据源是否有可能随着时间的推移而发生变化? 由于impressionsJoined未被缓存,因此spark会在每个操作中从头开始重新评估它,包括再次从源中读取数据。

在加入后尝试缓存impressionsJoined