[HADOOP] Hive에서 밀리 초 단위로 문자열을 타임 스탬프로 변환하는 방법
HADOOPHive에서 밀리 초 단위로 문자열을 타임 스탬프로 변환하는 방법
밀리 초를 잃지 않고 하이브 (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.다음 코드를 사용하여 부분 문자열의 지저분한 연결을 피하는 방법을 찾았습니다.
다음 코드를 사용하여 부분 문자열의 지저분한 연결을 피하는 방법을 찾았습니다.
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.이 양식의 날짜 필드는 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.나는 이것이 지저분하지 않고 이루어질 수 있다고 생각하지 않는다. unix_timestamp () 함수 문서에 따르면 시간은 초이므로 밀리 초 부분을 생략합니다.
나는 이것이 지저분하지 않고 이루어질 수 있다고 생각하지 않는다. unix_timestamp () 함수 문서에 따르면 시간은 초이므로 밀리 초 부분을 생략합니다.
"Unix 타임 스탬프 (초 단위)로 주어진 패턴을 가진 시간 문자열을 변환하고, 실패하면 0을 반환합니다 : unix_timestamp ( '2009-03-20', 'yyyy-MM-dd') = 1237532400."
여기서 가장 좋은 옵션은 지저분한 연결을 피하고 싶다면 UDF를 작성하여 처리하는 것입니다. 그러나 연결은 (지저분하지만) 직업에 더 좋을 것이다.
-
==============================
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.간단한 전략은 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)
위의 명령문은 원하는대로 타임 스탬프를 반환합니다.
from https://stackoverflow.com/questions/26355194/how-to-convert-a-string-to-timestamp-with-milliseconds-in-hive by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브 쿼리의 간단한 예가 있습니까? (0) | 2019.07.10 |
---|---|
[HADOOP] 하이브 테이블에서 읽기 및 spark SQL을 사용하여 다시 쓰기 (0) | 2019.07.10 |
[HADOOP] Hadoop / MapReduce를 사용하여 연결된 구성 요소 찾기 (0) | 2019.07.10 |
[HADOOP] hadoop 분산 캐시에서 파일 액세스하기 (0) | 2019.07.09 |
[HADOOP] JAVA_HOME이 (가) hadoop으로 잘못 설정되었습니다. (0) | 2019.07.09 |