迄今为止,hive / dmy / yyyy' dd / MMM / yyyy'格式顺序和按问题分组

时间:2016-02-27 10:33:14

标签: date datetime hadoop hive

我将约会存储为[27/Feb/2016:00:24:31 +0530]。 我想在27/Feb/2016中使用日期格式,并且也希望按它排序。 我已经尝试了this解决方案,但它以2016-02-27格式返回,并且还可以正确排序。

SELECT 
TO_DATE( FROM_UNIXTIME( UNIX_TIMESTAMP( SUBSTR( time, 2, 11), 'dd/MMM/yyyy' ))) AS real_date,
url 
FROM cleanned_logs 
ORDER BY real_date ASC;

为了获得所需的格式,我尝试使用date_format()函数。它在1.2.1中不可用,所以我从1.0.1切换到它。

SELECT
DATE_FORMAT( FROM_UNIXTIME( UNIX_TIMESTAMP( SUBSTR(time,2,11),'dd/MMM/yyyy')), 'dd/MMM/yyyy') AS real_date,
url 
FROM cleanned_logs 
ORDER BY real_date ASC;

它为我提供了所需的格式,但没有正确排序。

更新:

SELECT display_date,COUNT(url) FROM 
(
SELECT SUBSTR(time,2,11) as display_date,url,UNIX_TIMESTAMP(SUBSTR(time,2,11),'dd/MMM/yyyy') as real_date FROM cleanned_logs order by   real_date ASC 
)b  group by real_date;

在分组中创建问题。这里的hive在select子句中需要real_date

1 个答案:

答案 0 :(得分:0)

我认为您将数据的格式或显示与基础数据本身混为一谈。如果表将日期存储为以一种方式格式化的字符串,[27/Feb/2016:00:24:31 +0530]它仍然是一个字符串,字符串的排序方式与实际日期,时间戳或数字不同。

理想情况下,您可以将日期存储为TIMESTAMP数据类型。如果要显示它,请使用DATE_FORMAT,如果要对其进行排序,请在基础数据字段上使用ORDER BY。因此,如果您的字段属于名为TIMESTAMP的{​​{1}}类型,则可以查询为

some_time

如果您遇到了存储为有效时间戳值的字符串,那么您可能需要做更多的工作,也许

SELECT DATE_FORMAT(some_time, 'dd/MMM/yyyy')
FROM some_table
WHERE some_condition
ORDER BY some_time DESC

第二个选项显示所需的值,并按数字排序 - 一个unix时间戳只是一个数字,但它与日期的顺序相同,因此无需再将其强制转换为实际日期。 / p>