在Amazon Athena中按顺序显示分区

时间:2018-06-07 08:02:18

标签: amazon-athena

我有这个问题:

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;

4 个答案:

答案 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表。假设您将yearmonth作为分区(使用一个分区键,这当然会更简单):

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
...

有关更多信息,请参见:

https://docs.aws.amazon.com/athena/latest/ug/querying-glue-catalog.html#querying-glue-catalog-listing-partitions

答案 3 :(得分:-1)

SHOW PARTITIONS命令不允许您对结果进行排序,因为此命令不会生成要排序的结果集。此命令仅生成字符串输出。

另一方面,您可以查询分区列,然后按值对结果进行排序。

select distinct dt from tablename order by dt asc;