복붙노트

[HADOOP] Hive에서 밀리 초 단위로 문자열을 타임 스탬프로 변환하는 방법

HADOOP

Hive에서 밀리 초 단위로 문자열을 타임 스탬프로 변환하는 방법

밀리 초를 잃지 않고 하이브 (0.13.0)의 타임 스탬프로 변환해야하는 밀리 초가있는 타임 스탬프를 나타내는 문자열 '20141014123456789'가 있습니다.

나는 이것을 시도했지만 unix_timestamp는 정수를 리턴하므로 밀리 초를 잃는다.

from_unixtime(unix_timestamp('20141014123456789', 'yyyyMMddHHmmssSSS'))      >> 2014-10-14 12:34:56    

문자열 주조가 작동합니다.

cast('2014-10-14 12:34:56.789' as timestamp)      >> 2014-10-14 12:34:56.789

하지만 내 문자열은 그 형식이 아닙니다.

내 문자열을 '20141014123456789'에서 '2014-10-14 12 : 34 : 56.789'로 다시 형식화해야한다고 생각합니다. 나의 도전은 부분 문자열을 지저분하게 연결하지 않고이를 수행하는 방법이다.

해결법

  1. ==============================

    1.다음 코드를 사용하여 부분 문자열의 지저분한 연결을 피하는 방법을 찾았습니다.

    다음 코드를 사용하여 부분 문자열의 지저분한 연결을 피하는 방법을 찾았습니다.

    select cast(regexp_replace('20141014123456789', 
                               '(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})',
                               '$1-$2-$3 $4:$5:$6.$7') as timestamp) 
    
  2. ==============================

    2.이 양식의 날짜 필드는 2015-07-22T09 : 00 : 32.956443Z (문자열로 저장 됨)입니다. 나는 날짜 조작을해야했다. 작은 지저분한 나를 위해 잘 일한 경우에도 다음 명령 :

    이 양식의 날짜 필드는 2015-07-22T09 : 00 : 32.956443Z (문자열로 저장 됨)입니다. 나는 날짜 조작을해야했다. 작은 지저분한 나를 위해 잘 일한 경우에도 다음 명령 :

    select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename;
    

    이것은 혼란스러워 보이지만, 그것을 분해하면 아주 쉽습니다. 밀리 초 단위로 날짜와 시간을 추출하고 중간에 공간을 연결 한 다음 전체를 연결하여 타임 스탬프로 변환합니다. 이제 이것은 날짜 또는 타임 스탬프 조작에 사용될 수 있습니다.

  3. ==============================

    3.나는 이것이 지저분하지 않고 이루어질 수 있다고 생각하지 않는다. unix_timestamp () 함수 문서에 따르면 시간은 초이므로 밀리 초 부분을 생략합니다.

    나는 이것이 지저분하지 않고 이루어질 수 있다고 생각하지 않는다. unix_timestamp () 함수 문서에 따르면 시간은 초이므로 밀리 초 부분을 생략합니다.

    "Unix 타임 스탬프 (초 단위)로 주어진 패턴을 가진 시간 문자열을 변환하고, 실패하면 0을 반환합니다 : unix_timestamp ( '2009-03-20', 'yyyy-MM-dd') = 1237532400."

    여기서 가장 좋은 옵션은 지저분한 연결을 피하고 싶다면 UDF를 작성하여 처리하는 것입니다. 그러나 연결은 (지저분하지만) 직업에 더 좋을 것이다.

  4. ==============================

    4.문자열 형식의 테이블에 'birth_date'열이 있다고 가정 해 보겠습니다. birth_date를 사용하여 필터링하려면 다음 쿼리를 사용해야합니다.

    문자열 형식의 테이블에 'birth_date'열이 있다고 가정 해 보겠습니다. birth_date를 사용하여 필터링하려면 다음 쿼리를 사용해야합니다.

    date_Format(birth_date, 'yyyy-MM-dd HH:mm:ssSSS')
    

    다음과 같은 방식으로 쿼리에 사용할 수 있습니다.

    select * from yourtable
    where 
    date_Format(birth_date, 'yyyy-MM-dd HH:mm:ssSSS') = '2019-04-16 07:12:59999';
    
  5. ==============================

    5.간단한 전략은 date_format (arg1, arg2)을 사용하는 것입니다. 여기서 arg1은 형식화 된 문자열, 날짜 또는 시간 소인 형식의 타임 스탬프이고 arg2는 (arg1의) 문자열 형식입니다. format 인수로 받아 들일 수있는 것은 SimpleDateFormat java 문서를 참조하십시오.

    간단한 전략은 date_format (arg1, arg2)을 사용하는 것입니다. 여기서 arg1은 형식화 된 문자열, 날짜 또는 시간 소인 형식의 타임 스탬프이고 arg2는 (arg1의) 문자열 형식입니다. format 인수로 받아 들일 수있는 것은 SimpleDateFormat java 문서를 참조하십시오.

    그래서,이 경우 :

    date_format('20141014123456789', 'yyyyMMddHHmmssSSS')
    

    '2014-10-14 12 : 34 : 56.789'문자열을 생성 한 다음 타임 스탬프로 캐스팅 할 수 있습니다.

    cast(date_format('20141014123456789', 'yyyyMMddHHmmssSSS') as timestamp)
    

    위의 명령문은 원하는대로 타임 스탬프를 반환합니다.

  6. from https://stackoverflow.com/questions/26355194/how-to-convert-a-string-to-timestamp-with-milliseconds-in-hive by cc-by-sa and MIT license