我没有深入细节,我想知道是否有人遇到过类似的奇怪行为。
我在scala spark-shell中运行所有这些,spark 1.4.1。
我有一个名为"数据"的火花df。基本上这些是镶木地板文件,使用sql.context读入spark。我对这个数据集进行了一些转换,包括过滤器,groupBy,排序,计数,......没什么太奇特,所有确定性,没有任何随机性。通过这种方式,我创建了一些衍生的df的subset_1和subset_2。在最后,我运行以下类型的计算:
data.join(subset_1,"key_A").withColumnRenamed("count","count_1").join(subset_2,"key_A").filter("Feature LIKE 'inactive'").groupBy($"key_A",$"key_B").count.withColumnRenamed("count","count_2").groupBy($"key_A").count.withColumnRenamed("count","count_3").groupBy($"count_3").count.collect()
此计算运行"罚款"从语法的角度来看。但是,在此查询的不同运行中,我得到了不同的结果。例如:
res82: Array[org.apache.spark.sql.Row] = Array([31,3], [32,2], [34,1], [35,1], [38,1], [42,1], [44,1], [52,1], [61,2], [81,1], [1,4933], [2,2361], [3,924], [4,441], [5,220], [6,130], [7,80], [8,59], [9,36], [10,24], [11,13], [12,12], [13,7], [14,7], [15,11], [16,6], [17,4], [18,6], [19,3], [20,5], [21,6], [22,3], [24,1], [25,1], [26,2], [27,2], [28,1], [29,1], [30,3])
和
res81: Array[org.apache.spark.sql.Row] = Array([32,3], [35,3], [43,1], [46,2], [52,1], [122,1], [145,1], [165,1], [1,3515], [2,1887], [3,836], [4,381], [5,238], [6,136], [7,84], [8,51], [9,39], [10,28], [11,28], [12,13], [13,7], [14,13], [15,8], [16,10], [17,8], [18,6], [19,4], [20,2], [21,4], [22,3], [23,4], [24,1], [25,2], [26,1], [28,3], [29,1], [30,2])
同样,相同的数据,相同的代码,在我做的事情中没有包含随机性,仍然是:随机结果。
任何想法都受到高度赞赏。
答案 0 :(得分:1)
好的,"问题"我遇到的与以下内容有关:
Spark sort by key and then group by to get ordered iterable?
基本上,必须非常小心sort和groupBy的组合。
示例:假设您的数据框df
包含person
,status
和date
列。我们假设你想获得一个人的最新状态。有人可能会想到这样的事情:
df.sort($"date").groupBy($"person").agg(sql.functions.last($"status"))
不幸的是,如果你。收集结果,并且你多次尝试,你会意识到结果可能会有所不同(我猜,如果df下面的数据只包含一个,那么它们只会是相同的划分)。这是因为.sort在分区上本地完成,并且在groupBy期间将分区放在一起的方式决不能保证"全局顺序" $" date"在小组内。