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 表。其中一个客户端应用程序可以使用from
和to
日期以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:获取匹配分区列表的主要内容,如果未能解决你的问题,请参考以下文章