选择具有最大值的行,结合 WHERE。 MAX 和 CAST,在 spark.sql
Selecting rows with maximum value, combining WHERE. MAX, and CAST, in spark.sql
我在 Spark 中有一个 table,其中有一个 date_string
字符串类型的列。
我正在查找与最近日期 对应的select 行。我认为可以在一个命令中实现这一点,将字符串列转换为数字,并 selecting 对应于最大日期的行。
我试过了
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。
其次,这只有returns一行。如果可以重复,那么一种方法是:
SELECT t.*
FROM data.some_table t
WHERE t.date_string = (SELECT MAX(t2.date_string)
FROM data.some_table t2
);
我在 Spark 中有一个 table,其中有一个 date_string
字符串类型的列。
我正在查找与最近日期 对应的select 行。我认为可以在一个命令中实现这一点,将字符串列转换为数字,并 selecting 对应于最大日期的行。
我试过了
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。
其次,这只有returns一行。如果可以重复,那么一种方法是:
SELECT t.*
FROM data.some_table t
WHERE t.date_string = (SELECT MAX(t2.date_string)
FROM data.some_table t2
);