繁体   English   中英

选择具有最大值的行,结合 WHERE。 MAX 和 CAST,在 spark.sql 中

[英]Selecting rows with maximum value, combining WHERE. MAX, and CAST, in spark.sql

我在 Spark 中有一个表,其中包含一个字符串类型的date_string列。

我希望选择与最近日期相对应的行 我认为可以在一个命令中实现这一点,将字符串列转换为数字,并选择与最大日期相对应的行。

我试过

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    date = MAX(date)

但这给了我一个错误

Error in SQL statement: AnalysisException: cannot resolve '`date`' given input columns

所以我试过了

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    date = (SELECT MAX(date_string) FROM data.some_table)

这给了我同样的错误信息。

SELECT 
    * 
FROM 
    (SELECT *, CAST(date_string AS INT) AS date 
    FROM data.some_table)
WHERE 
   date = MAX(date)

给我

Error in SQL statement: UnsupportedOperationException: Cannot evaluate expression: max(cast(input[71, string, false] as int))

SELECT 
    *, 
    CAST(date_string AS INT) AS date 
FROM
    data.some_table
WHERE 
    CAST(date_string AS INT) = MAX(CAST(date_string AS INT))

给我与上一个命令相同的错误消息。

我是 Spark 和 SQL 的新手,所以我完全迷失在这里。 实现我想要的正确命令是什么?

你似乎已经很接近了。 但是,您不能在WHERE子句中使用在FROM子句中计算的列(它在SELECT子句之前计算)。

这应该有效:

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    date_string = (SELECT MAX(date_string) FROM data.some_table)

或者,如果你需要cast比较之前,则:

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
WHERE 
    CAST(date_string AS INT) = (SELECT MAX(CAST(date_string AS INT)) FROM data.some_table)

请注意,这假设您确实希望允许联系。 否则,您可以将查询简化为使用限制子句:

SELECT 
    *, 
    CAST(date_string AS INT) AS date
FROM 
    data.some_table
ORDER BY
    date_string
LIMIT 1

您不需要将日期字符串转换为数字。 所以这应该做你想做的:

SELECT t.*
FROM data.some_table
ORDER BY date_string DESC
LIMIT 1;

这假设date_string具有合理的格式,例如 YYYY-MM-DD。

其次,这只返回一行。 如果您可以有重复项,那么一种方法是:

SELECT t.*
FROM data.some_table t
WHERE t.date_string = (SELECT MAX(t2.date_string)
                       FROM data.some_table t2
                      );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM