2016-12-20 10 views
1

Я хотел бы получить миллисекундную точность из некоторых дельтах datetime, которые у меня есть. Нет функции millisecond(), которую я вижу для Hive.Улей: извлечение миллисекунд с интервалом_day_time?

Рассмотрим это:

with t as (
    select (CAST(1481652239798 AS TIMESTAMP) - CAST(1481652228576 as timestamp)) 
    as delta 
) 
select delta from t; 

0 00:00:11.222000000 

Я могу работать с этим, если бы я мог преобразовать этот вывод в строку и извлечь часть следующий период.

with t as (
    select (CAST(1481652239798 AS TIMESTAMP) - CAST(1481652228576 as timestamp)) 
    as delta 
) 
select instr(delta, '.') from t 

11 -- correct index of '.' 

Так инстр() обрабатывает дельта в виде строки, но я не могу подстроки его:

with t as (
    select (CAST(1481652239798 AS TIMESTAMP) - CAST(1481652228576 as timestamp)) 
    as delta 
) 
select substr(delta, 11) from t; -- directly supplying instr() leads to a different bug with parsing the query syntax 

No matching method for class org.apache.hadoop.hive.ql.udf.UDFSubstr with (interval_day_time, int) 

Любые обходные пути?

+0

Я не знаю, улей, но: вы не можете сохранить его в виде строки в новую переменную, затем порезать? –

+0

Это безумие. Вы начинаете с чисел, чья единица составляет ** количество миллисекунд ** с эпохи UNIX, затем вы конвертируете их в Timestamps, тогда вы вычисляете разницу во времени, после чего вы хотите вернуться к миллисекундам. Почему бы вам просто не подставить свои первоначальные цифры и не стать счастливым? –

+0

То, что вы пытаетесь, находится вне меня. Но даже несмотря на то, что Hive должен допускать неявное преобразование из метки времени в строку ([Документация] (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-AllowedImplicitConversions)), по-видимому, это не для эта функция. По этой причине я ненавижу неявные броски. – Andrew

ответ

0

Если вы нанесли объект timestamp на double, он сохраняет часть миллисекунды.

Так попробуйте следующее:

with t as (
    select CAST(1481652239798 AS TIMESTAMP) as ts1, 
      CAST(1481652228576 as timestamp) as ts2    
) 
select ts1, 
     ts2, 
     (ts1-ts2) as delta, 
     floor((CAST(ts1 AS double)-CAST(ts2 as double))*1000) as delta_ms 
from t