2017-02-13 4 views
0

타임 스탬프 열에 dt_skey이라는 열을 파생시키고 있습니다. 테이블에 타임 스탬프 열이 있습니다. 명확한 설명을 위해 타임 스탬프 열 이름을 time_column으로 가정하십시오. 이것은 time_column이 2017-02-05 03:33:50, dt_skey 열이 다음과 같이 보이는 것입니다. 20170205033350은 그 사이의 기호를 제거하는 것입니다.하이브에서 타임 스탬프를 gmt 형식으로 변환하는 방법

내 질문은 여기에 : time_column은 est timezone에 있는데, 나는 그 중에서 dt_skey을 추출하는 동안 그것을 gmt 형식으로 변환하려고합니다. 우리가 임 프라를 통해 쿼리 할 때 timestamp가 gmt 형식으로 변환되는 이유는 dt_skey이 int 데이터 유형이므로 변환되지 않을 것이기 때문입니다. 하이브를 통해 쿼리 할 때 타임 스탬프와 dt_skey 열이 동기화되는 하이브를 통해 처리를 수행하고 있습니다. 보고 목적과 우리는 임팔라를 사용하기 때문에 dt_skey 열을 변경하려고합니다. 그러면 임팔라를 통해 보면 열이 모두 동기화되어야합니다. 위의 쿼리는이 20170202에이 2017-02-02 07:32:51 변환됩니다

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

: 아래

내가 타임 스탬프 열에서 dt_skey 열을 도출하기 위해 사용하고는 SQL이다.

dt_skey을 GMT 형식으로 상쇄하도록 도와주세요. 나는 또한 스파크를 통한 해결책을 환영한다.

+0

왜 mysql 태그입니까? 대시를 제거하면 "2017-02-05"가 "20170233"이 될 것이라고 확신합니까? –

+0

내 sql 태그는 하이브가 꽤 많은 sql quires를 사용하기 때문에 날짜가 그냥 사이에 대시를 제거 할 것이기 때문에 나는 단지 질문을 편집하여 변경 사항을 확인하십시오. Thankyou – Rob

답변

1

: 당신은 같은 시간대 테이블을 설치할 수 있습니다

SELECT datetimefield+0; 

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

CONVERT_TZ 반환 NULL 경우 스파크에서 :

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| 
+-------------------+---------------------+--------------+ 

또는 하이브 515,는 :

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 -from-mysql-to-spark/47518691 # 47518691' – User12345

0

당신만을처럼 필드에 0을 추가해야합니다

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

내가 (사용되지 GMT 제외 GMT와 동일한 UTC를 사용하여) 임팔라 타임 스탬프로 (현재 시스템의 시간대를 사용) 하이브 타임 스탬프 열을 변환하는 방법 그건하는 하이브 쿼리를합니다. 당신이 처리하는 타임 스탬프가 하둡 클러스터에서 사용하는 시스템 시간대 관련이 있음을 가정 -

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" 

PRINTF('%tz', ts)

동적으로 일광 절약 시간 돌보는, 시간대를 추출합니다. 다른 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 | 

...

+-------------------------+--------------------+-------------------------------+---------------------+ 
| 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 | 

변환 실행 중 밀리 초는 손실됩니다. 그들은 추가적인 트릭으로 복구 될 수 있지만 일반적으로 그 지점을 벗어난다.


사이드 참고 : 문자열에 타임 스탬프 포맷 (또는 날짜 또는 플로트이든) 할 수는 좋은 오래된 자바 PRINTF() 기능은 ... 모든

0

감사의 기본 형식 플러스 REGEXP_***() 기능을 사용하여보다 훨씬 더 실용적이다 솔루션 제공

여기에있는 모든 해답은 아래의 구문을 시도한 답안 자원을 사용하여 부분 해답을 갖고 있습니다. "2017년 2월 16일 12시 20분 21초"

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

위의 구문을 설명하기 위해이 내 타임 스탬프 열이 (SS : mm YYYY-MM-DD HH)과 같은 모습입니다 위의 구문을 실행하면 내 출력은 'yyyyMMdd'인 '20170216'과 같습니다. regexp_replace는 yyyyMMdd 만 표시하는 정규식을 수행합니다. to_utc_timestamp(timestamp_column, 'EST')은 타임 스탬프 열을 UTC 시간대로 변환합니다.