如何解决在Hive分区列上执行日期数学
我的数据按标准的Hive格式按天进行分区:
/year=2020/month=10/day=01
/year=2020/month=10/day=02
/year=2020/month=10/day=03
/year=2020/month=10/day=04
...
我想使用Amazon Athena(IE:Presto)查询最近60天的所有数据。我希望该查询使用分区列(year
,month
,day
),以便仅扫描必要的分区文件。假设我无法更改文件分区格式,那么解决此问题的最佳方法是什么?
解决方法
您不必使用year
,month
,day
作为表的分区键。您可以拥有一个名为date
的分区键,并添加如下所示的分区:
ALTER TABLE the_table ADD
PARTITION (`date` = '2020-10-01') LOCATION 's3://the-bucket/data/year=2020/month=10/day=01'
PARTITION (`date` = '2020-10-02') LOCATION 's3://the-bucket/data/year=2020/month=10/day=02'
...
通过此设置,您甚至可以将分区键的类型设置为date
:
PARTITIONED BY (`date` date)
现在您有了一个带有date
列的表,该列的类型为DATE
,您可以使用任何date and time functions对其进行计算。
使用此设置将无法执行的操作是使用MSCK REPAIR TABLE
来加载分区,但是无论如何您都不应该这样做-它非常缓慢且效率低下,实际上只有在您拥有几个分区加载到新表中。
Theo提出的另一种方法是使用以下语法,例如:
const queryRunner = this.connection.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
const newChild = await queryRunner.manager.insert<Child>('child',child);
当列select ... from my_table where year||month||day between '2020630' and '20201010'
,year
和month
的格式为字符串时,此方法有效。跨月查询特别有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。