首页 > 解决方案 > Zeppelin - 两次相同的 show(),两个不同的结果

问题描述

我是 Zeppelin 的新手,也许我的问题很幼稚。首先,我得到这样的基本数据:

import org.apache.spark.sql.functions.sql
val dfOriginal = sql("SELECT CAST(event_type_id AS STRING), event_time  FROM sl_event SORT BY event_time LIMIT 200")

+-------------+--------------------+ 
|event_type_id| event_time| 
+-------------+--------------------+ 
| 23882|2018-05-03 11:41:...| 
| 23882|2018-05-03 11:41:...| 
| 23882|2018-05-03 11:41:...| 
| 25681|2018-05-03 11:41:...| 
| 23882|2018-05-03 11:41:...| 
| 2370|2018-05-03 11:41:...| 
| 23882|2018-05-03 11:41:...|
...

我有200条这样的记录。

我计算偶数类型的出现,如下所示:

val dfIndividual = dfOriginal.groupBy("event_type_id").count().sort(-col("count"))
dfIndividual.show(200)

我很困惑:每当我执行这个(在 Zeppelin 中)时,我都会得到不同的结果。例如:

+-------------+-----+
|event_type_id|count| 
+-------------+-----+ 
| 24222| 30| 
| 10644| 16| 
| 21164| 9|
...

或 - 几秒钟后:

+-------------+-----+ 
|event_type_id|count| 
+-------------+-----+ 
| 5715| 34| 
| 3637| 19| 
| 3665| 17| 
| 9280| 13|
...

这两个结果之间的差异让我非常害怕。问题出在哪里?是齐柏林飞艇吗?底层火花?如何保证我会在这里得到可重复的结果?

标签: scalaapache-sparkapache-spark-sqlapache-zeppelin

解决方案


我能想到的唯一原因是

a) 同时源表sl_event发生了变化。由于您没有缓存结果,因此您调用的任何操作(例如show)都会重新评估所有内容

或 b)您有许多相同的事件event_time,因此 order byevent_time limit 200不会给您一致的结果,SORT BY event_time, event_type_id LIMIT 200请在您的第一个查询中尝试,或者更好地使用唯一 id 您的第二个排序列


推荐阅读