问题几乎在标题中。我无法找到有关差异的详细文档。
我确实注意到了一个区别,因为在交换cube和groupBy函数调用时,我会得到不同的结果。我注意到对于使用' cube'的结果,我在经常分组的表达式上得到了很多空值。
答案 0 :(得分:59)
这些不是以相同的方式工作。 groupBy
只是标准SQL中GROUP BY
子句的等价物。换句话说
table.groupBy($"foo", $"bar")
相当于:
SELECT foo, bar, [agg-expressions] FROM table GROUP BY foo, bar
cube
相当于CUBE
GROUP BY
的扩展名。它采用列列表并将聚合表达式应用于分组列的所有可能组合。假设你有这样的数据:
val df = Seq(("foo", 1L), ("foo", 2L), ("bar", 2L), ("bar", 2L)).toDF("x", "y")
df.show
// +---+---+
// | x| y|
// +---+---+
// |foo| 1|
// |foo| 2|
// |bar| 2|
// |bar| 2|
// +---+---+
并使用count作为聚合计算cube(x, y)
:
df.cube($"x", $"y").count.show
// +----+----+-----+
// | x| y|count|
// +----+----+-----+
// |null| 1| 1| <- count of records where y = 1
// |null| 2| 3| <- count of records where y = 2
// | foo|null| 2| <- count of records where x = foo
// | bar| 2| 2| <- count of records where x = bar AND y = 2
// | foo| 1| 1| <- count of records where x = foo AND y = 1
// | foo| 2| 1| <- count of records where x = foo AND y = 2
// |null|null| 4| <- total count of records
// | bar|null| 2| <- count of records where x = bar
// +----+----+-----+
与cube
类似的函数是rollup
,它从左到右计算层次小计:
df.rollup($"x", $"y").count.show
// +----+----+-----+
// | x| y|count|
// +----+----+-----+
// | foo|null| 2| <- count where x is fixed to foo
// | bar| 2| 2| <- count where x is fixed to bar and y is fixed to 2
// | foo| 1| 1| ...
// | foo| 2| 1| ...
// |null|null| 4| <- count where no column is fixed
// | bar|null| 2| <- count where x is fixed to bar
// +----+----+-----+
只是为了进行比较,我们可以看到普通groupBy
的结果:
df.groupBy($"x", $"y").count.show
// +---+---+-----+
// | x| y|count|
// +---+---+-----+
// |foo| 1| 1| <- this is identical to x = foo AND y = 1 in CUBE or ROLLUP
// |foo| 2| 1| <- this is identical to x = foo AND y = 2 in CUBE or ROLLUP
// |bar| 2| 2| <- this is identical to x = bar AND y = 2 in CUBE or ROLLUP
// +---+---+-----+
总结:
GROUP BY
时,每行只包含一次相应的摘要。 GROUP BY CUBE(..)
每行包含在其代表的每个级别组合的摘要中,包括通配符。从逻辑上讲,上面显示的内容相当于这样(假设我们可以使用NULL
占位符):
SELECT NULL, NULL, COUNT(*) FROM table
UNION ALL
SELECT x, NULL, COUNT(*) FROM table GROUP BY x
UNION ALL
SELECT NULL, y, COUNT(*) FROM table GROUP BY y
UNION ALL
SELECT x, y, COUNT(*) FROM table GROUP BY x, y
GROUP BY ROLLUP(...)
与CUBE
类似,但通过从左到右填充列来实现分层次。
SELECT NULL, NULL, COUNT(*) FROM table
UNION ALL
SELECT x, NULL, COUNT(*) FROM table GROUP BY x
UNION ALL
SELECT x, y, COUNT(*) FROM table GROUP BY x, y
ROLLUP
和CUBE
来自数据仓库扩展,因此如果您想更好地了解其工作原理,您还可以查看自己喜欢的RDMBS的文档。例如,PostgreSQL在9.5和these are relatively well documented中都引入了。
答案 1 :(得分:-2)
2.group,你知道吗?
3.rollup和cube是GROUPING SET运算符。 汇总是一种分层的多维集聚和处理要素
并且在多维数据集中而不是对元素进行分层处理,多维数据集在所有维度上都执行相同的操作。 您可以尝试grouping_id来了解抽象级别