【问题标题】:Scala-Spark Different Results [closed]Scala-Spark 不同的结果 [关闭]
【发布时间】:2018-01-26 12:39:54
【问题描述】:

我正在尝试根据事件对我拥有的数据进行三元组,因此为此我使用DataFrames

val w = Window.partitionBy(args(1)).orderBy(args(2))

val lastDf = df.withColumn("OnePreviousEvent", lag(df(args(3)), 1).over(w))
  .withColumn("twoPreviousEvent", lead(df(args(3)), 1).over(w))
  .withColumn("new", concat_ws(",", $"OnePreviousEvent", col(event), $"twoPreviousEvent"))
  .where($"twoPreviousEvent".isNotNull && $"OnePreviousEvent".isNotNull)
  .groupBy("new").agg(count("new").alias("tripCount")).sort($"tripCount".desc)

我想问的是——每次我运行这段代码,我都会得到不同的结果。任何关于为什么会发生这种情况的想法将不胜感激。 谢谢

【问题讨论】:

    标签: scala apache-spark spark-dataframe


    【解决方案1】:

    这并没有什么奇怪的。让我们看一下您的代码示例,将args(1..3) 替换为x, yandz` 以便于分析:

    val x: Column
    val y: Column
    val z: Column
    
    val w = Window.partitionBy(x).orderBy(y)
    
    val lastDf = df.withColumn("OnePreviousEvent", lag(z, 1).over(w))
      .withColumn("twoPreviousEvent", lead(z), 1).over(w))
    

    窗口使用y 排序,而您使用lagz。如果z 中存在关联,则结果是不确定的。例如如果数据:

    val df = Seq(
      (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4)
    ).toDF("x", "y", "z")
    

    那么有 24 种不同的可能排序:

    (1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), ...
    

    每个都满足PARTITION BY xORDER BY y

    当且仅当所有 y 值都是唯一的时,排序将是唯一且稳定的。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2019-06-03
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多