【问题标题】:SHOW PARTITIONS with order by in Amazon Athena在 Amazon Athena 中按顺序显示分区
【发布时间】:2018-11-17 01:20:25
【问题描述】:

我有这个问题:

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;

但它给出了:

亚马逊雅典娜;状态码:400;错误代码:InvalidRequestException;

【问题讨论】:

    标签: amazon-athena


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      your comment 看来,您正在寻找对分区进行排序以判断是否存在特定分区的方法。为此,我建议您使用 Glue API 而不是查询 Athena。运行 aws glue get-partition help 或查看您首选 SDK 的文档以了解其工作原理。

      还有一个变体可以列出表的所有分区,运行aws glue get-partitions help 以了解更多信息。我不认为它按字母顺序返回分区,但它有过滤运算符。

      【讨论】:

        【解决方案3】:

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

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

        select distinct dt from tablename order by dt asc;
        

        【讨论】:

        • 我的目标是检查分区是否已创建。无论数据与哪个分区相关,您的查询都会向我显示表中的数据。
        • 这个方案会扫描表中的所有数据,可能会很慢而且很贵。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2018-10-06
        • 2021-05-11
        相关资源
        最近更新 更多