如何计算 Spark SQL 中满足特定条件的总数百分比

Posted

技术标签:

【中文标题】如何计算 Spark SQL 中满足特定条件的总数百分比【英文标题】:How to calculate the percentage of total that meet a certain condition in Spark SQL 【发布时间】:2015-12-17 08:52:26 【问题描述】:

考虑以下数据:

Name | Value
-----|------
A    |  0
A    | 15
A    |  5
B    |  3
B    | 10
B    | 12

我想把它改成:

Name | Total | With Value >= 10 | Percentage
-----|-------|------------------|-----------
A    | 3     | 1                | 33%
B    | 3     | 2                | 66%

最好在 Spark SQL 中。

备注:在我的真实案例中,Value 是一个数组,我想知道那些具有非空数组的百分比。

【问题讨论】:

到目前为止你尝试了什么? 如果你的“值”列是一个数组,那么你是如何考虑转换你的数据框以便被查询的?无论如何,可用于创建所需输出的查询是我的答案中的查询,唯一的前提条件是您的数组是每行一个值的表。 【参考方案1】:

Spark SQL 只是常规 SQL,尽管 SQL 功能有限,因此您可以编写一个常规查询,如下所示:

SELECT
    NAME
    , COUNT(*) AS Total
    , SUM(CASE WHEN Value >= 10 THEN 1 ELSE 0 END) AS "With Value >= 10"
    , (COUNT(*) * 1.0 /SUM(CASE WHEN Value >= 10 THEN 1 ELSE 0 END)) * 100
FROM <table>
GROUP BY NAME

【讨论】:

我觉得需要count(1)而不是count(*),我试试看。 @BreakPhreak 应该没什么区别,两者都很好。实际上,在某些 RDBMS 系统中,更倾向于使用 COUNT(*) 并且运行速度更快,但我不认为 Spark 使用它们相同的引擎。

以上是关于如何计算 Spark SQL 中满足特定条件的总数百分比的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sql函数平均值总数最小值最大值

Spark SQL:窗口函数滞后直到满足条件

如何计算满足特定条件的熊猫 groupby 的值

如果满足条件,SQL Count 函数计算所有行

如果if条件满足,如何跳转到for循环中的特定位置?

HIVE/Impala 查询:计算满足特定条件的行之间的行数