2015-12-10 42 views
1

我得到类似的问题不工作:星火GROUPBY AGG预期

(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) 

时,它提供一台计算机上运行:(15123144,15123144)

当集群中运行它给:(15123144, 24)

第一个是预期的,看起来正确,但第二个是可怕的错误。还有一点观察 - 即使我改变总数超过/小于15123144的数据,我在群集上得到distinct = 24。 即使我交换user_id和电子邮件,它也会给出相同的不同计数。

我比较困惑的看到:https://spark.apache.org/docs/1.5.2/api/scala/index.html#org.apache.spark.sql.DataFrame

AGG的医生说:对整个数据帧不聚集群。 “没有组”?那是什么意思?

任何线索?或Jira票?或者现在可以解决的问题?

回答

1

让我们从“无组”部分开始。由于它是在文档中描述:

df.agg(...)是df.groupBy()的简写AGG(...)

如果仍然不明确。将它转换为SQL:

SELECT SOME_AGGREGATE_FUNCTION(some_column) FROM table 

关于你提到的第二个问题是很难给你一个很好的答案,但无数据,但一般来说这两个查询是不等价的访问。第一个简单地计算不同的email值,第二个计算每个电子邮件的最后user_id的唯一值。此外last没有明确的排序是没有意义的。

+0

感谢zero323,正如我所说的:当在一台计算机上运行时,它会给出:(15123144,15123144),并且通过数据不应该为不同的user_id重复发送电子邮件,反之亦然。我可以对数据说多少。对不起,我无法在这里分享样本数据。 –

+0

没有显式的排序(就像在窗口函数中一样)“last”没有意义,所以根据配置你可以得到不同的结果。我将开始检查在集群中的'df.groupBy(...).agg(...)。select(...).distinct'后面得到的内容。它应该给你一些想法是怎么回事(是否有任何空值/空字符串)。没有一个可重复的例子(这里没有人想要你的真实数据),这个问题与任何开放的JIRA一样,都只是一种好奇心。 – zero323

+0

在日志中,我看到:15/12/11 17:43:20 INFO scheduler.TaskSetManager:在slave4.example.com(24/24)上的阶段14.0(TID 795)中完成的任务23.0在671毫秒内是否与24个不同的值,或者我们可以从日志中的这条线做出任何事情? –