仅基于月/年对配置单元表进行分区或bucketing以优化查询

6tqwzwtp  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(291)

我正在构建一个表,其中包含一个消息传递应用程序的大约40万行数据。当前表的列如下所示:
消息| id(int)|发送方|用户id(int)|其他|列(字符串)|其他|列2(int)|创建| dt(时间戳)
我将来运行的许多查询都将依赖于涉及create\u dt列的where子句。因为我希望这个表能够增长,所以我想现在就尝试优化它。我知道分区是一种方法,但当我基于create\u dt对其进行分区时,结果是分区太多,因为我的每个日期都跨越到2013年11月。
有没有办法用一系列日期来代替分区?每三个月分一次怎么样?甚至每个月?如果这是可能的-我可能有太多的分区,在未来使其效率低下?其他可能的分区方法是什么?
我也读过bucketing,但据我所知,只有在对bucket所基于的列执行连接时,它才有用。我很可能只在列sender\u userid(int)上执行连接。
谢谢!

svmlkihl

svmlkihl1#

查看Hive内置的自定义项。有了正确的组合,你就能达到你想要的。下面是一个对每个月进行分区的示例(生成可以用作分区列值的“年-月”字符串):

select concat(cast(year(to_date(create_dt)) as string),'-',cast(month(to_date(create_dt)) as string))

但是,在对日期进行分区时,通常有多个级别的日期维度是有用的,因此在这种情况下,您应该有两个分区列,第一个用于年,第二个用于月:

select year(to_date(create_dt)),month(to_date(create_dt))

请记住,时间戳和日期是字符串,像month()或year()这样的函数返回整数作为日期字段的值。您可以使用简单的数学运算来找出正确的分区。

jhdbpxl9

jhdbpxl92#

我认为这可能是一个过早优化的情况。我不确定您对“太多分区”的定义是什么,但我们有一个类似的用例。我们的表是按日期和客户列划分的。我们的数据可以追溯到2013年3月。这创建了大约160k+个分区。我们还在date上使用了一个过滤器,我们还没有看到这个模式有任何性能问题。
另一方面,hive在将数千个分区和表扩展到100个方面做得越来越好。
另一方面,我很好奇为什么你要用Hive来做这个。40万行数据量很小,不太适合配置单元。

相关问题