2013-05-30 2 views
1

COPY 명령 (http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html)을 사용하여 아마존 레드 쉬프트 클러스터에 아파치 스타일의 로그를로드하려고하는데 날짜 분석에 문제가 있습니다. 내 날짜는 다음과 같다 :아마존 redshift에서 아파치 로그로드하기

[10/Oct/2000:13:55:36 -0700]

적색 편이 [시간 형식의 문서 http://docs.aws.amazon.com/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html 는 "당신은 날짜와 시간 부분 사이에 공백 문자를 지정해야합니다"고 말한다. 실제로 그 사이에 콜론이 있기 때문에 시간 형식으로 사용하면 무슨 일이 일어나는지 확인했습니다. 그 결과는 성공했지만 분과 초는 0으로 설정되었습니다.

  1. 가 어떤인가 :

    그래서

    , 내 질문 (시간대는 또 다른 문제이지만, 현재 그를지지하는 의도가없는 것 같은데, 그래서 별도로 처리) COPY를 사용하여 구문 분석하는 방법은?

  2. 그렇지 않으면 EC2에서 로그 파일을 사전 처리하거나 날짜를 문자열로로드하고 redshift의 적절한 타임 스탬프 열로 구문 분석해야한다고 생각합니다. 어떤 조언이 바람직합니까?

+0

동일한 문제가 있습니다. 내가 발견 한 유일한 해결책은 이미 발견 한 해결책입니다. – Cory

답변

0

표준 시간대 형식을 제거하고 그대로로드 할 수 있습니다. 예를 들어 나는이 일을하고있다 : 파일 형식 2013-07-31T03:59:41.000Z에 날짜와 시간이에 국지적 인 펄 명령은 위의 날짜 필드에 절대적으로 잘로드 2013-07-31 03:59:41.000로 변환합니다

perl -pi.bak -e 's/(\d\d\d\d-\d\d-\d\d)T(\d\d\:\d\d:\d{2}\.\d{3})Z/\1 \2/g' $FILENAME 

. 로드 된 시간을 UTC라고 가정하면 convert_timezone을 사용할 수 있습니다.

3

이제 Amazon Redshift는 COPY 명령의 TIMEFORMAT 'auto'옵션을 사용하여 Apache 액세스 로그의 타임 스탬프 형식을 구문 분석 할 수 있습니다. 다음은 예제입니다.

CREATE TABLE time_test (time_text VARCHAR, time TIMESTAMP); 
COPY time_test from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' DELIMITER '\t' TIMEFORMAT 'auto'; 
SELECT * FROM time_test; 

      time_text   |  time 
------------------------------+--------------------- 
[10/Oct/2000:13:55:36 -0700] | 2000-10-10 13:55:36 

다음은 샘플 TSV 데이터입니다.

[10/Oct/2000:13:55:36 -0700]  [10/Oct/2000:13:55:36 -0700] 

또한이 옵션은 INSERT 및 UPDATE와 함께 작동합니다. 다음 SQL을 사용하여 동일한 결과를 얻을 수 있습니다.

INSERT INTO time_test VALUES ('[10/Oct/2000:13:55:36 -0700]', '[10/Oct/2000:13:55:36 -0700]'); 

그러나이 예에서 Amazon Redshift는 여전히 시간대를 지원하지 않기 때문에 시간대 부분 (-0700)은 무시됩니다. 이 방법을 사용하는 경우 UTC 시간대로 로그 데이터를 작성하는 것과 같이 시간대 문제를 별도로 처리해야합니다.

관련 문제