2011-08-26 4 views
8

타임 스탬프 열을 포함하는 로그 파일이 있습니다. 타임 스탬프는 유닉스 에포크 시간 형식입니다.하이브에서 유닉스 시대 시간 문자열을 변환하는 방법

년, 월, 일로 구성된 파티션이있는 타임 스탬프를 기반으로 파티션을 만들고 싶습니다.

지금까지이 작업을 수행했지만 오류가 발생했습니다.

PARSE ERROR cannot recognize input '(' in column type 

여기 내 코드입니다.

from (
     from raw_data 
      MAP ${PREFIX}raw_data.line 
      USING 's3://scripts/clean.py' 
      AS (timestamp STRING, name STRING) 
    ) map_out 
INSERT OVERWRITE TABLE date_base_data_temp PARTITION(year(timestamp), month(timestamp)), day(timestamp))) 
    select map_out.name; 

답변

24

우프, 어색해 보인다. 하이브에서이 기능을 사용하십시오 :

SELECT from_unixtime(unix_timestamp) as new_timestamp from raw_data ... 

또는 타임 스탬프 대신 초 ms에있는 경우 :

YYYY-MM-DD HH로 유닉스 타임 스탬프로 변환
SELECT from_unixtime(unix_timestamp DIV 1000) as new_timestamp from raw_data ... 

: MM : SS 형식으로, 당신은 년, 월, 일을 얻기 위해 다음과 같은 기능을 사용할 수 있습니다

하이브와 SparkSQL, 날짜 및 유형 캐스팅 옵션의 데이터 유형의 최신 버전으로
SELECT year(new_timestamp) as year, month(new_timestamp) as month, day(new_timestamp) as day ... 
+0

감사합니다! 많은 시간을 절약했습니다. 이것은 내가 찾고 있었던 바로 그 것이다! –

+2

'timestamp_value' (여기서'unix_timestamp')가 초 단위인지 확인하십시오. 그렇지 않으면'from_unixtime (timestamp_value DIV 1000)'을 사용하십시오. – narush

+0

초까지만 시간이 있습니다.하지만 ms도 원합니다. 내가 어떻게 그럴 수 있니? – Avinash

4

사용할 수 있습니다. 사용자 정의 형식으로 날짜를 변환해야하는 경우 스파크 SQL뿐만 아니라 하이브에서 다음과 같은 작업을해야하는 것은

SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable 
2

, 이것을 사용 :

select date_format(from_unixtime(epoch_datetime),'yyyMM') as formatted_date from myHiveTable; 


월 (1 년 기준), 예를 들어 같은 날짜를 반환하는 201,708

0

타임 스탬프 문자열 파티션 날짜 문자열 YYYY-MM-DD로 변환 할 필요가 목록에이 쿼리를 추가 :

hive> select date_format(from_unixtime(epoch_datetime), 'yyyy-MM-dd') as day from table_name limit 20; 

-- If required, remove the millis precision for timestamps 
hive> select date_format(from_unixtime(cast(epoch_datetime/1000 as bigint)), 'yyyy-MM-dd') as day from table_name limit 20; 
관련 문제