Hadoop 如何在一天内用所有时间戳(86400)填充配置单元表

Hadoop 如何在一天内用所有时间戳(86400)填充配置单元表,hadoop,hive,timestamp,hdfs,hiveql,Hadoop,Hive,Timestamp,Hdfs,Hiveql,我想要一个包含4列的配置单元表。这里的键可以是多个,计数应该是数字0。我需要一张一天中每一秒每一把钥匙的记录。 例如,我有两个键A和B。我希望表中每个键有86400条记录。从00:00:00到23:59:59 我知道当前的时间戳函数。不确定它是否适合这里 Date, Key, Timestamp, Count 2019-05-31, A, 00:00:00, 0 2019-05-31, A, 00:00:01, 0 2019-05-31, A, 00:00:02, 0 . . . 2019-05

我想要一个包含4列的配置单元表
。这里的键可以是多个,计数应该是数字0。我需要一张一天中每一秒每一把钥匙的记录。 例如,我有两个键A和B。我希望表中每个键有86400条记录。从
00:00:00到23:59:59

我知道当前的时间戳函数。不确定它是否适合这里

Date, Key, Timestamp, Count
2019-05-31, A, 00:00:00, 0
2019-05-31, A, 00:00:01, 0
2019-05-31, A, 00:00:02, 0
.
.
.
2019-05-31, A, 23:59:59, 0
2019-05-31, B, 00:00:00, 0
2019-05-31, B, 00:00:01, 0
2019-05-31, B, 00:00:02, 0
.
.
.
2019-05-31, B, 23:59:59, 0

此查询将生成所需的时间戳:

 select from_unixtime(unix_timestamp('2019-05-31 00:00:00')+i) as ts 
   from (select 
               posexplode(split(space(86399),' ')) as (i,x)
        )s
说明:

子查询s以秒生成行。如果您使用这样的子查询进行连接,例如使用交叉连接(这取决于您的初始数据集),您将得到每行复制86400次

空格(86399)
-生成86399个空格的字符串
split()
-生成数组空间
posexplode
-分解数组并生成位置和元素表。 位置(i)在0-86399范围内,我们将使用它作为秒来添加开始时间戳

unix\u时间戳('2019-05-31 00:00:00')
-这将以秒为单位给出从unix epoch传递的开始时间戳。我们将秒(i)添加到它并再次转换为时间戳,这样我们就可以为每一行获得1秒递增的时间戳

加入它,如果您需要单独的日期和时间,请使用子字符串

演示:

例如,您的初始表包含两行时间戳和两个键A和B,您可以将其与生成子查询的秒数连接起来:

with your_table as( --This is initial data example
select stack(2,
'2019-05-31 00:00:00', 'A', 
'2019-05-31 00:00:00', 'B'
) as (ts, Key)
)

select min(ts), max(ts), key --aggregated result for the demo
from
(
select from_unixtime(unix_timestamp(t.ts)+i) as ts , t.key
  from your_table t
      cross join (select posexplode(split(space(86399),' ')) as (i,x))s
)s group by key
结果(添加了聚合,因为它生成的行太多):

min                 max                 key
2019-05-31 00:00:00 2019-05-31 23:59:59 B
2019-05-31 00:00:00 2019-05-31 23:59:59 A