Hive 雅典娜分区位置

Hive 雅典娜分区位置,hive,presto,amazon-athena,Hive,Presto,Amazon Athena,我可以使用 show partitions my_table 我可以使用 describe formatted my_table partition (partition_col='value') 但是我有很多分区,如果可以避免的话,我不想解析descripe formatted的输出 有没有一种方法可以在一个查询中获取所有分区及其位置?没有内置的或一致的方法来获取此信息 假设您知道分区列,您可以通过以下查询获得此信息 select distinct partition_col, "$pat

我可以使用

show partitions my_table
我可以使用

describe formatted my_table partition (partition_col='value')
但是我有很多分区,如果可以避免的话,我不想解析
descripe formatted
的输出


有没有一种方法可以在一个查询中获取所有分区及其位置?

没有内置的或一致的方法来获取此信息

假设您知道分区列,您可以通过以下查询获得此信息

select distinct partition_col, "$path" from my_table

获取表分区位置最便宜的方法是使用Glue API中的
GetPartitions
调用。它将列出所有分区及其值和位置。您可以使用AWS CLI工具进行如下尝试:

aws glue get-partitions --region us-somewhere-1 --database-name your_database --table-name the_table
使用类似SQL的
SELECT DISTINCT partition\u col,
表中的“$path”可能很昂贵,因为Athena不幸扫描了整个表以生成输出(它可能只查看了表元数据,但优化似乎还不存在)。

使用
bot3
(从1.12.9版开始)下面返回完整列表:

glue\u client=boto3.client(“glue”)
glue\u paginator=glue\u client.get\u paginator(“get\u分区”)
pages\u iter=glue\u paginator.paginate(
DatabaseName=db\u name,TableName=table\u name
)
res=[]
对于第页中的第页,请执行以下操作:
对于第[“分区”]页中的分区:
res.append(
{
“值”:分区[“值”],
“位置”:分区[“存储描述符”][“位置”],
}
)

这个答案可能有助于假设您可以/有权访问metastore。不幸的是,在Athena上,无法访问metastore。您是否尝试从my_表中选择不同的$path?Presto的配置单元连接器公开隐藏的
$path
列,该列为。。指向包含行的文件的路径。Hi-Piotr-
选择不同的“$path”,分区\u col
可能是最好的解决方案。似乎仍然不支持这种基本优化!非常感谢你的回答。我希望在扫描了一个巨大的表之后,我没有发现它是一个查询太晚了:(这的另一个优点是,结果很容易解析。它是否返回所有分区?当使用
bot3
时,结果以分页方式返回…假设数据是以配置单元原生方式(=对于分区)结构化的,
选择不同的regexp\u extract_表中的(“$path”、“.+/”)是一个很好的解决方案,它提供了(路径中的)所有分区扫描0字节。@Tim我不明白它将如何扫描零字节。正如我在回答中提到的,对
$path
,您的查询将扫描表中的每个字节。在较新版本的Presto中,有这样的优化,但Athena没有。