仅基于月/年的分区或分区配置单元表来优化查询

时间:2015-01-05 20:21:35

标签: hadoop hive

我正在构建一个包含大约400k行消息传递应用程序数据的表。 当前表格的列如下所示:


message_id(int)| sender_userid(int)| other_col(string)| other_col2(int)| create_dt(timestamp)

我将来运行的很多查询将依赖于涉及create_dt列的where子句。由于我希望这个表能够增长,我现在想尝试优化它。我知道分区是一种方式,但是当我基于create_dt对其进行分区时,结果是分区太多,因为我的每个日期都跨越到2013年11月。

是否可以通过一系列日期进行分区?每3个月分区怎么样?甚至每个月?如果这是可能的 - 将来可能会有太多分区使其效率低下吗?还有哪些其他可能的分区方法?

我也读到了关于分组的内容,但据我所知,只有在你对基于该分组的列进行连接时才有用。我很可能只在列sender_userid(int)上进行连接。

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为这可能是过早优化的一个例子。我不确定你对"太多分区"的定义是什么?是,但我们有一个类似的用例。我们的表按日期和客户列分区。我们的数据可以追溯到2013年3月。这创建了大约160k +分区。我们还在日期使用了过滤器,我们还没有看到此模式存在任何性能问题。

另一方面,Hive在扩展到数以万计的分区和表格方面做得越来越好。

另一方面,我很好奇你为什么要首先使用Hive。 400k行是一小部分数据,并不适合Hive。

答案 1 :(得分:0)

查看内置UDF的配置单元。通过正确组合,您可以实现您想要的效果。这是每个月进行分区的示例(生成" YEAR-MONTH"您可以用作分区列值的字符串):

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()这样的函数会将整数作为日期字段的值返回。您可以使用简单的数学运算来找出正确的分区。