Scala Spark groupBy agg未按预期工作

Scala Spark groupBy agg未按预期工作,scala,apache-spark,dataframe,aggregate-functions,Scala,Apache Spark,Dataframe,Aggregate Functions,我也遇到了类似的问题: (df .groupBy("email") .agg(last("user_id") as "user_id") .select("user_id").count, df .groupBy("email") .agg(last("user_id") as "user_id") .select("user_id") .distinct .count) 在一台计算机上运行时,它给出:(1512314415123

我也遇到了类似的问题:

(df
    .groupBy("email")
    .agg(last("user_id") as "user_id")
    .select("user_id").count,
df
    .groupBy("email")
    .agg(last("user_id") as "user_id")
    .select("user_id")
    .distinct
    .count)
在一台计算机上运行时,它给出:(1512314415123144)

在集群上运行时,它给出:(15123144,24)

第一个是预期的,看起来正确,但第二个是可怕的错误。再观察一次——即使我更改了总计数大于/小于15123144的数据,我在集群上得到distinct=24。 即使我交换用户id和电子邮件,它也会给出相同的不同计数

我更困惑的是看到:

Agg doc表示:在整个数据帧上聚合,而不使用组。“没有团体”?这是什么意思

有线索吗?还是吉拉的票?或者现在可以修复什么?

让我们从“无组”部分开始。如文件所述:

agg(…)是df.groupBy().agg(…)的缩写

如果仍不清楚,则转换为SQL:

SELECT SOME_AGGREGATE_FUNCTION(some_column) FROM table

关于你的第二个问题,如果不访问数据,很难给你一个好的答案,但一般来说,这两个查询是不等价的。第一个简单地统计不同的
电子邮件
值,第二个统计每封电子邮件最后一个
用户id
的唯一值。此外,如果没有明确的顺序,最后一个是没有意义的

感谢zero323,正如我提到的:当在一台计算机上运行时,它会给出:(1512314415123144),并且根据数据,对于不同的用户id,电子邮件不应重复,反之亦然。关于数据,我能说的就这么多。很抱歉,我无法在此共享示例数据。如果没有明确的顺序(如在窗口函数中)
last
没有意义,因此您可以根据配置获得不同的结果。我将首先检查在集群上的
df.groupBy(…).agg(…).select(…).distinct
之后得到什么。它应该会让您知道发生了什么(是否涉及空字符串)。没有一个可复制的例子(这里没有人想要你的真实数据),这个问题和任何打开的JIRA一样,只是一个好奇。在日志中,我看到:15/12/11 17:43:20 INFO scheduler.TaskSetManager:在slave4.example.com(24/24)上以671毫秒的时间完成了14.0阶段(TID 795)中的任务23.0这与24个不同的值有关吗?或者我们可以从这一行从日志中得到任何东西?不多。看起来每个分区只保留一个值。可能是一些散列问题。。。尝试过以上建议吗?建议中没有空字符串或空字符串。如果它真的是一个散列问题,我如何跟踪它到散列?