Impala:获取匹配分区列表

Posted

技术标签:

【中文标题】Impala:获取匹配分区列表【英文标题】:Impala: Get the list of matching partitions 【发布时间】:2020-04-23 12:19:07 【问题描述】:

我们有一个按year=yyyy/month=mm/day=dd/hour=hh 分区的impala 表。其中一个客户端应用程序可以使用fromto 日期以dd/mm/yyyy 格式向其发送select 查询。

现在,例如。如果from 日期设置为01/11/2019 并且to 日期设置为29/02/2020,为了使用分区,imapla SQL 应该是这样的:

select * from table where (year = 2019 AND month in (11, 12)) OR (year = 2020 AND month in (1,2))

impala SQL 中有没有办法将日期转换为上面的正确分区?

不幸的是,有问题的客户端是一个不允许对上述逻辑进行编程的 BI 工具。

【问题讨论】:

作为一个 BI 工具并不是不在查询中使用分区列的借口。 你能试试 - 年份(from_dt)和年份(to_dt)之间的 table_year 和月份(from_dt)和月份(to_dt)之间的 table_month。但我认为这不会遵循分区。 @koushiksinharoy 不幸的是,这适用于上述时间范围重叠 2 年的示例。 你能不能试试这个糟糕的 sql 然后 - WHERE CAST( concat (CAST(table_year AS string), CAST(table_month AS string)) AS BIGINT) BETWEEN CAST( concat (CAST(YEAR(from_dt) AS string), CAST(MONTH(from_dt) AS string)) AS BIGINT) AND CAST( concat (CAST(YEAR(to_dt) AS string), CAST(MONTH(to_dt) AS string)) AS BIGINT) @koushiksinharoy 你说它不好,我说它聪明 :) 这确实有效。我不得不在 concat 的前一个月 lpad,但这个想法有效并且遵循了正确的分区。你能把这个作为答案吗,我会接受的。谢谢!! 【参考方案1】:

所以,解决方案是 -WHERE CAST( concat (CAST(table_year AS string), CAST(table_month AS string)) AS BIGINT) BETWEEN CAST( concat (CAST(YEAR(from_dt) AS string), CAST(MONTH(from_dt) AS string)) AS BIGINT) AND CAST( concat (CAST(YEAR(to_dt) AS string), CAST(MONTH(to_dt) AS string)) AS BIGINT)

基本上,将年份和月份连接成一个字符串,然后将其转换为整数以在函数之间使用。这将适用于任何日期到任何日期范围。由于您在月份和年份上有分区,因此此过滤器将遵循分区并正常工作。

【讨论】:

以上是关于Impala:获取匹配分区列表的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 impala 表中的分区数

在 Pyspark 中返回错误结果的 Impala 查询

Impala 如何支持分区?

大压缩文件对Impala查询性能的影响

Impala分区表

带 hdfs 的 Impala 分区表