【问题标题】:how to group a date in a string type in hive如何在配置单元中对字符串类型的日期进行分组
【发布时间】:2018-10-30 00:56:43
【问题描述】:

我有一个日期列,数据类型为字符串,如下所示,

我的查询是: select cast(substr(date,1,10),date) date , count(date) from table group by 日期;

date

1   1/1/1970 12:00:00 AM
2   1/1/1970 12:00:00 AM
3   1/1/1970 12:00:00 AM
4   1/1/1970 12:00:00 AM
5   1/1/1970 12:00:00 AM
6   1/1/1970 12:00:00 AM
7   1/1/1970 12:00:00 AM
8   1/1/1970 12:00:00 AM
9   1/1/1970 12:00:00 AM
10  1/1/1970 12:00:00 AM

所以当我使用按日期分组时,同一天仍然有多行,我想我可能需要将数据类型转换为日期,但仍然无法正常工作,有人可以帮忙吗?

【问题讨论】:

标签: sql types group-by hive


【解决方案1】:

如果你想要日期并且列是一个字符串,只需使用substr()

select substr(date, 10), count(*)
from t
group by substr(date, 10);

哎呀。我意识到你的日期不是一个合理的格式(比如 MM/DD/YYYY)。你可以使用instring():

select substr(date, 1, instring(date, ' ')) as dte, count(*)
from t
group by dte;

【讨论】:

  • 所以如果我按日期分组,结果中仍然有多个相同的日期,我希望每天只有一个日期,没有重复
  • @JingHong 。 . .如果您的日期是您所说的格式,那么第二个版本(带有修复)应该是您想要的。
【解决方案2】:

Hive 中的日期格式为 yyyy-MM-dd

如果您想将字符串字段转换为日期,请使用

hive> select date(from_unixtime(unix_timestamp(`date`, 'MM/dd/yyyy hh:mm:ss a'),'yyyy-MM-dd')) `date`,count(*) from dd group by date(from_unixtime(unix_timestamp(`date`, 'MM/dd/yyyy hh:mm:ss a'),'yyyy-MM-dd'));
+-------------+------+--+
|    date     | _c1  |
+-------------+------+--+
| 1970-01-01  | 10   |
+-------------+------+--+

在此语句中,我们将日期字段转换为 日期数据类型,并将所有日期分组。

(或)

如果您只想在MM/dd/yyyy 上进行分组,请使用 split 功能并分组

hive> select split(`date`,' ')[0] `date`,count(*) from dd group by split(`date`,' ')[0]; 
+-----------+------+--+
|   date    | _c1  |
+-----------+------+--+
| 1/1/1970  | 10   |
+-----------+------+--+

【讨论】:

    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2019-10-29
    • 2012-06-14
    • 2020-05-20
    相关资源
    最近更新 更多