使用此问题中的示例,在聚合所有可能的组合时,如何创建计数为0的行?使用cube
时,不填充计数为0的行。
下面是代码和输出:
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
// +----+----+-----+
但这是所需的输出(添加的第4行)。
// +----+----+-----+
// | 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| 1| 0| <- count of records where x = bar AND y = 1
// | 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
// +----+----+-----+
是否有其他函数可以做到这一点?
2条答案
按热度按时间ldioqlga1#
我同意这里的
crossJoin
是正确的方法。但是我认为以后使用join
而不是union
和groupBy
可能会更通用。特别是当有多个聚合时。kwvwclae2#
首先,让我们来看看为什么您没有得到数据集中没有出现的组合。
cube
使用指定的列为当前数据集创建多维多维多维数据集,以便可以对它们运行聚合。有关所有可用的聚合函数,请参阅RelationalGroupedDataset。
正如医生所说
cube
只是一个花哨的group by。您也可以通过对结果运行explain
来检查这一点。您会发现cube
基本上是一个扩展(以取得nulls
)和group by。因此,它无法显示不在数据集中的组合。为此需要一个连接,以便从不一起出现在同一记录中的值可以“相遇”。因此,让我们构建一个解决方案:
其产生: