Я хотел бы получить миллисекундную точность из некоторых дельтах 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)
Любые обходные пути?
Я не знаю, улей, но: вы не можете сохранить его в виде строки в новую переменную, затем порезать? –
Это безумие. Вы начинаете с чисел, чья единица составляет ** количество миллисекунд ** с эпохи UNIX, затем вы конвертируете их в Timestamps, тогда вы вычисляете разницу во времени, после чего вы хотите вернуться к миллисекундам. Почему бы вам просто не подставить свои первоначальные цифры и не стать счастливым? –
То, что вы пытаетесь, находится вне меня. Но даже несмотря на то, что Hive должен допускать неявное преобразование из метки времени в строку ([Документация] (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-AllowedImplicitConversions)), по-видимому, это не для эта функция. По этой причине я ненавижу неявные броски. – Andrew