我有这个问题:
SHOW PARTITIONS tablename;
结果是:
dt=2018-01-12
dt=2018-01-20
dt=2018-05-21
dt=2018-04-07
dt=2018-01-03
这给出了每个表的分区列表。此表的分区字段为dt
,它是日期列。我想看看订购的分区。
文档没有解释如何执行此操作: https://docs.aws.amazon.com/athena/latest/ug/show-partitions.html
我试图通过以下方式添加订单:
SHOW PARTITIONS tablename order by dt;
但它给出了:
AmazonAthena;状态代码:400;错误代码:InvalidRequestException;
答案 0 :(得分:3)
我刚刚遇到了同样的问题,并在information_schema
数据库中找到了解决方案。如果您的表仅包含一个分区列,请使用以下查询获取有序列表:
SELECT partition_value
FROM information_schema.__internal_partitions__
WHERE table_schema = '<DB_NAME>'
AND table_name = '<TABLE_NAME>'
ORDER BY partition_value
答案 1 :(得分:1)
在your comment中,您似乎正在寻找对分区进行排序的方法,以弄清是否存在特定的分区。为此,我建议您使用Glue API而不是查询Athena。运行aws glue get-partition help
或查看首选SDK的文档以了解其工作原理。
还有一种变体可以列出表的所有分区,请运行aws glue get-partitions help
以了解有关此表的更多信息。我不认为它会按字母顺序返回分区,但是它具有用于过滤的运算符。
答案 2 :(得分:0)
AWS当前(自Nov 2020起)支持两个版本的Athena引擎。一个人如何选择和订购分区取决于所使用的版本。
版本1:
使用information_schema
表。假设您将year
,month
作为分区(使用一个分区键,这当然会更简单):
WITH
a as (
SELECT partition_number as pn, partition_key as key, partition_value as val
FROM information_schema.__internal_partitions__
WHERE table_schema = 'my_database'
AND table_name = 'my_table'
)
SELECT
year, month
FROM (
SELECT val as year, pn FROM a WHERE key = 'year'
) y
JOIN (
SELECT val as month, pn FROM a WHERE key = 'month'
) m ON m.pn = y.pn
ORDER BY year, month
输出:
year month
0 2018 10
0 2018 11
0 2018 12
0 2019 01
...
版本2:
使用内置的$partitions
功能,其中分区可显式地用作列,并且语法更加简单:
SELECT year, month FROM my_database."my_table$partitions" ORDER BY year, month
year month
0 2018 10
0 2018 11
0 2018 12
0 2019 01
...
有关更多信息,请参见:
答案 3 :(得分:-1)
SHOW PARTITIONS
命令不允许您对结果进行排序,因为此命令不会生成要排序的结果集。此命令仅生成字符串输出。
另一方面,您可以查询分区列,然后按值对结果进行排序。
select distinct dt from tablename order by dt asc;