如何在 sparkSQL 中使用从子查询中获取单个值

Posted

技术标签:

【中文标题】如何在 sparkSQL 中使用从子查询中获取单个值【英文标题】:How can I use get a single value from my subquery in sparkSQL 【发布时间】:2021-06-08 07:13:06 【问题描述】:

我正在使用 SparkSQL

spark.sql("""
        SELECT artist, count(distinct(song))
        FROM user_log_table WHERE artist =
       (SELECT artist
        FROM user_log_table
        GROUP BY artist
        ORDER BY count(artist) DESC
        LIMIT 1 )        
""").show()

这是我的查询,我只运行了子查询,它给了我一个我正在寻找的值,然后我想在 where 子句中使用该值,但我得到了错误

调用 o22.sql 时出错。 :org.apache.spark.sql.AnalysisException:分组表达式序列为空,并且'user_log_table.`artist`'不是聚合函数。在窗口函数中包装 '(count(DISTINCT user_log_table.`song`) AS `count(DISTINCT song)`)' 或在 first() (或 first_value)中包装 'user_log_table.`artist`' 如果你不这样做关心你得到的价值。;;

【问题讨论】:

【参考方案1】:

您希望拥有最多日志条目的一位艺术家的歌曲计数。如果有两位艺术家的日志条目数相同,您可以任意选择一位。至少这是您的查询所做的。而且您不需要子查询:

SELECT
  artist,
  COUNT(DISTINCT song)
FROM user_log_table
GROUP BY artist
ORDER BY COUNT(*) DESC
LIMIT 1;

这为您提供了具有两个值(艺术家和歌曲数量)的一行。当然,如果您只需要这两个值之一,则可以从 select 子句中删除 artistCOUNT(distinct song)

【讨论】:

以上是关于如何在 sparkSQL 中使用从子查询中获取单个值的主要内容,如果未能解决你的问题,请参考以下文章

如何从子查询中获取结果作为查询中的参数

如何从子查询中只获取一行?

如何从子查询中的 2 个或多个字段中获取最大值

如何从子表单中获取父 Symfony3 表单的值?

从子查询中获取表名以在一行中用于 Oracle 中的删除/更新/插入子句

如何使用 laravel 5 中的查询生成器从子查询中进行选择