date - hive cast string to date in 'dd/MMM/yyyy' format order by and group by issue

标签 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;

在分组中产生问题。这里配置单元在 select 子句中期望 real_date

最佳答案

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

理想情况下,您会将日期存储为 TIMESTAMP 数据类型。当你想显示它时,使用 DATE_FORMAT,当你想对其排序时,在基础数据字段上使用 ORDER BY。因此,如果您的字段类型为 TIMESTAMP,称为 some_time,您可以查询为

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

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

SELECT SUBSTR(some_time, 2, 11)
FROM some_table
WHERE some_condition
ORDER BY unix_timestamp(SUBSTR(some_time,2,11), 'dd/MMM/yyyy'))

第二个选项根据需要显示值,并按数字排序——unix 时间戳只是一个数字,但它与日期的顺序相同,因此无需将其进一步转换为实际日期。

关于date - hive cast string to date in 'dd/MMM/yyyy' format order by and group by issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668624/

相关文章:

datetime - 具有特定日期/时间范围的PowerShell脚本

hadoop - 将 pig 结果存储到本地文件

mySQL DateDiff 小时按日期

javascript - 检查日期在 Typescript 中是否有效?

javascript - 将 JavaScript 日期转换为 .NET 日期时间

hadoop - Hadoop将文件复制到hadoop文件系统

hadoop - 主机名解析失败

javascript - Gijgo DateTimePicker 过去日期禁用

JavaScript - 查找下一次更改的日期(标准或夏令时)

python - 给定时间原点,如何将日期时间从十进制转换为 “%y-%m-%d %H:%M:%S”?