2017-02-13 24 views
0

У меня есть столбец timestamp в моей таблице, я получаю столбец с именем dt_skey из столбца timestamp. Для четкого объяснения давайте предположим, что имя столбца метки времени как time_column. Вот как выглядит time_column: 2017-02-05 03:33:50, dt_skey столбец выглядит так: 20170205033350, что не что иное, как удаление символов между ними.Как преобразовать временную метку в формат gmt в hive

Мой вопрос здесь: time_column находится в часовом поясе, я хочу преобразовать его в формат gmt, пока я получаю dt_skey из него. Причина, по которой я хочу сделать это, - это временная метка будет преобразована в формат gmt, когда мы запрашиваем ее через impala, где dt_skey не будет преобразован, так как это тип данных int. Я делаю проглатывание через куст, где временная метка и столбец dt_skey будут синхронизироваться при запросе через куст. Для целей отчетности и пользователей мы используем impala, поэтому я хочу внести изменения в столбец dt_skey, чтобы, если пользователь просматривает impala, оба столбца должны быть синхронизированы.

Ниже SQL я использую, чтобы получить dt_skey столбец из столбца временной метки:

cast(substr(regexp_replace(cast(time_column as string), '-',''),1,8) as int)as dt_skey 

выше запрос будет преобразовывать этот 2017-02-02 07:32:51 в эту 20170202.

Пожалуйста, помогите мне компенсировать dt_skey в формате GMT. Я также приветствую решения через искру.

+0

Почему тег 'mysql'? и вы уверены, что «2017-02-05» становится «20170233» при удалении тире? –

+0

Мой тег sql заключается в том, что улей использует довольно много sql-запросов, и дата будет такой, как только удалены тире между ними, я только что отредактировал вопрос, пожалуйста, ознакомьтесь с этим изменением. Thankyou – Rob

ответ

1

In Spark:

rdd = spark.sparkContext.parallelize([('2017-02-05 03:33:50',)]) 
df = spark.createDataFrame(rdd, ['EST']) 
df = df.withColumn('GMT', f.to_utc_timestamp(df['EST'], 'EST')) 
res = df.withColumn('YouWanna', f.date_format(df['GMT'], 'yyyyMMddHHmmss')) 
res.show(truncate=False) 

+-------------------+---------------------+--------------+ 
|EST    |GMT     |YouWanna  | 
+-------------------+---------------------+--------------+ 
|2017-02-05 03:33:50|2017-02-05 08:33:50.0|20170205083350| 
+-------------------+---------------------+--------------+ 

Или в улье:

select date_format(to_utc_timestamp('2017-02-05 03:33:50','EST'), 'yyyyMMddHHmmss') from dual 

ли вы имеете в виду это?

+0

Не могли бы вы рассказать о следующем вопросе 'https://stackoverflow.com/questions/47518199/daylight-savings-time-issue-while-importing-data -из-MySQL к искре/47518691 # 47518691' – User12345

0

вы только должны добавить 0 в своей области, как:

SELECT datetimefield+0; 

SELECT CONVERT_TZ('2017-02-02 07:32:51','EST','GMT'); 

если CONVERT_TZ возвращение NULL можно установить таблицы часового пояса, как:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql 

образца

mysql> SELECT CONVERT_TZ('2017-02-02 07:32:51','EST','GMT'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2017-02-02 07:32:51','EST','GMT') | 
+-----------------------------------------------+ 
| 2017-02-02 12:32:51       | 
+-----------------------------------------------+ 
1 row in set (0,00 sec) 

mysql> 
mysql> SELECT DATE(TIMESTAMP('2017-02-02 07:32:51'))+0; 
+------------------------------------------+ 
| DATE(TIMESTAMP('2017-02-02 07:32:51'))+0 | 
+------------------------------------------+ 
|         20170202 | 
+------------------------------------------+ 
1 row in set (0,00 sec) 

mysql> select id, mydate, date(mydate), date(mydate)+0 from df; 
+----+---------------------+--------------+----------------+ 
| id | mydate    | date(mydate) | date(mydate)+0 | 
+----+---------------------+--------------+----------------+ 
| 1 | 2017-02-05 03:33:50 | 2017-02-05 |  20170205 | 
+----+---------------------+--------------+----------------+ 
1 row in set (0,00 sec) 

mysql> 

mysql> SELECT TIMESTAMP('2017-02-05 03:33:50')+0; 
+------------------------------------+ 
| TIMESTAMP('2017-02-05 03:33:50')+0 | 
+------------------------------------+ 
|      20170205033350 | 
+------------------------------------+ 
1 row in set (0,00 sec) 

mysql> 
mysql> select id, mydate, mydate+0 from df; 
+----+---------------------+----------------+ 
| id | mydate    | mydate+0  | 
+----+---------------------+----------------+ 
| 1 | 2017-02-05 03:33:50 | 20170205033350 | 
+----+---------------------+----------------+ 
1 row in set (0,00 sec) 

mysql> 
+0

Спасибо, что поделились этим, но изменение формата не является моей проблемой. Я хочу преобразовать измененный формат времени в часовой пояс gmt. – Rob

+0

извините, у меня есть добавочный образец часового пояса конвертирования в моем ответе –

0

Предполагая, что вы хотите запрос улей, вот как преобразовать столбец Hive TimeStamp (используя текущий часовой пояс системы) в Impala TimeStamp (с использованием UTC, которая является такой же, как по Гринвичу, за исключением GMT осуждается).

CREATE TEMPORARY MACRO to_impala_timestamp(ts TIMESTAMP) 
    CAST(FROM_UNIXTIME(UNIX_TIMESTAMP(ts) +CAST(CAST(PRINTF('%tz', ts) AS FLOAT)*36.0 AS INT)) AS TIMESTAMP) 
; 
--## WARNING - do not use MACROs if your Hive version is below V1.3 (Apache, Horton) 
--## or below V1.1-CDH5.7.3, V1.1-CDH5.8.3, V1.1-CDH5.9.0 (Cloudera) 
--## cf. "HIVE-11432 Hive macro give same result for different arguments" 

The PRINTF('%tz', ts) извлечет часовой пояс, заботясь о летнее время динамически - предполагая, что вы обработки метки времени, относятся к системы часовой пояс используется кластер Hadoop. Если это другой TZ, вам необходимо соответствующим образом адаптировать макрос.

Вы можете проверить его с этим запросом:

CREATE TABLE test_tz 
STORED AS Parquet 
AS 
SELECT CAST(ts AS STRING) AS initial_ts_as_string 
    , printf('%1$tz %1$tZ', ts) AS tzone_offset_and_code 
    , ts AS ts_for_hive 
    , to_impala_timestamp(ts) AS ts_for_impala 
FROM ... 

Нашего кластер использует центрально-европейское время, и это, как результат показывает в улье ...

+--------------------------+--------------------+-----------------------------+-------------------------+ 
| initial_ts_as_string | tz_offset_and_code | ts_for_hive     | ts_for_impala   | 
+--------------------------+--------------------+-----------------------------+-------------------------+ 
| 2015-09-13 11:32:30.627 | +0200 CEST   | 2015-09-13 11:32:30.627  | 2015-09-13 13:32:30.0 | 
| 2015-12-10 12:27:01.282 | +0100 CET   | 2015-12-10 12:27:01.282  | 2015-12-10 13:27:01.0 | 
| 2016-05-17 15:49:06.386 | +0200 CEST   | 2016-05-17 15:49:06.386  | 2016-05-17 17:49:06.0 | 

... затем в Impala ...

+-------------------------+--------------------+-------------------------------+---------------------+ 
| initial_ts_as_string | tz_offset_and_code | ts_for_hive     | ts_for_impala  | 
+-------------------------+--------------------+-------------------------------+---------------------+ 
| 2015-09-13 11:32:30.627 | +0200 CEST   | 2015-09-13 09:32:30.627000000 | 2015-09-13 11:32:30 | 
| 2015-12-10 12:27:01.282 | +0100 CET   | 2015-12-10 11:27:01.282000000 | 2015-12-10 12:27:01 | 
| 2016-05-17 15:49:06.386 | +0200 CEST   | 2016-05-17 13:49:06.386000000 | 2016-05-17 15:49:06 | 

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


Примечание стороны: форматировать TimeStamp (или дата или Float или любой другой) в строку, старый добрый Java PRINTF() функция способ более практичным, чем при использовании стандартного формата плюс REGEXP_***() функции ...

0

Спасибо за все предоставленные решения

Все ответы здесь имеют частичное решение, используя ресурсы ответа, которые я пробовал, используя синтаксис ниже, и он работал.

cast(substr(regexp_replace(to_utc_timestamp(timestamp_column, 'EST') ,'-',''),1,8) as int) as dt_skey 

Для объяснения выше синтаксиса, это как моя колонка временной метки выглядит (YYYY-MM-ДД ЧЧ: мм: сс) "2017-02-16 12:20:21"

После запуская указанный выше синтаксис, мой вывод будет похож на '20170216', который представляет собой 'yyyyMMdd' regexp_replace, чтобы регулярное выражение отображало только yyyyMMdd. to_utc_timestamp(timestamp_column, 'EST') преобразует столбец временной метки в часовой пояс UTC.