2013-03-04 37 views
3

如果我在Hive中定义了一个表格,并且将根据日期进行分区,并且我的日期格式为YYYYMMDD,我应该选择哪种类型,int或字符串?对于基于日期的Hive分区,为什么要使用字符串类型?为什么不是int?

如果它只是一个字段,并且因此在我为表提供的文件中,我可以看到使用一个字符串,即使只是为了能够搜索并识别可能以其方式工作的错误条目我的数据。但是因为我将指定分区作为加载过程的一部分,所以我知道我将始终具有正确的值。

当在Where子句中使用的,分区字段通常是平等或低于/大于逻辑。

回答

3

日期在Hive中通常被视为字符串。如果您查看所有可用的日期操作UDF,则它们使用字符串类型,所以如果您使用整数,则必须每次都施放它们。

从概念上讲,我认为使用字符串更有意义,YYYYMMDD只是日期对象的文字表示,但它隐含地等同于YYYY-MM-DD或DDMMYYYY之类的内容。所以如果你在这里使用一个整数,那么做这样的比较就变得很痛苦。

注意,您可以在蜂房平等也比较字符串/大/低于运营商,如果你想选择一个范围分区,您可以轻松地做到这一点与这些运营商。

便见使用“日期”为一个整数是使用时间戳(Unix风格),因为它是一个连续的值和表示实测的量的唯一情况。

+0

是的,对于其他字段存储日期,我通常使用的字符串,并且通常格式化为蜂巢时间(YYYY-MM-DD)。对于这种情况,分区中使用的日期已经格式化为YYYYMMDD,因此试图决定是否将类型设置为整数而不是字符串。如前所述,凡是使用分区日期的条款通常都是(在)平等测试。如果我认为我需要更复杂的日期函数,我会选择字符串并重新格式化为Hive日期格式。 – libjack 2013-03-04 18:53:24

+0

嘿关于比较字符串蜂房与磨碎机/低于操作如何工作?这意味着它检查长度和内容或者只检查其中的一个(这没有意义)。例如'2013-06-06'>'2013-06-07'false? '2013-06-06 00:00:00'>'2013-06-07'仍然是假的? – balaji 2013-06-06 04:49:02

2

因为YYYY-MM-DD是日期表示该标准是蜂巢的TO_DATE的输出()UDF 它也可以让你做懒之类的东西SELECT * FROM foo其中天>“2013”​​

http://xkcd.com/1179/

相关问题