11

SOLVED :이 문제의 '해결책'은 아래 업데이트 # 2를 참조하십시오.하이브, S3, EMR 및 복구 파티션으로 데이터로드

s3://($BUCKET)/y=2012/m=11/d=09/H=10/ 

내가 하이브로이로드를 시도하고 있습니다 : S3에서

~~~~~~~

, 내가 좋아하는 중첩 된 디렉토리 구조에 저장 된 .gz 파일 일부 로그 *이

create external table logs (content string) 
partitioned by (y string, m string, d string, h string) 
location 's3://($BUCKET)'; 

다음과 같은 다중 레벨 파티션 사양을 사용하는 EMR (Elastic Map Reduce)에서. 그럼 기존의 모든 파티션 복구를 시도 :

alter table logs recover partitions; 

이 작동하는 것 같다 및 내 S3 구조를 드릴 다운과 디렉토리의 모든 다양한 수준의 추가 않습니다

hive> show partitions logs; 
OK 
y=2012/m=11/d=06/h=08 
y=2012/m=11/d=06/h=09 
y=2012/m=11/d=06/h=10 
y=2012/m=11/d=06/h=11 
y=2012/m=11/d=06/h=12 
y=2012/m=11/d=06/h=13 
y=2012/m=11/d=06/h=14 
y=2012/m=11/d=06/h=15 
y=2012/m=11/d=06/h=16 
... 

그래서 것을 Hive는 내 파일 레이아웃을보고 해석 할 수 있습니다. 그러나 실제 데이터는로드되지 않습니다. 간단하게 계산하거나 *를 선택하려고하면 아무 것도 얻을 수 없습니다.

hive> select count(*) from logs; 
... 
OK 
0 

hive> select * from logs limit 10; 
OK 

hive> select * from logs where y = '2012' and m = '11' and d = '06' and h='16' limit 10; 
OK 

생각 하시겠습니까? 파티션을 복구하는 것 이상의 데이터를로드하기 위해 몇 가지 추가 명령이 누락 되었습니까?

내가 수동으로 다음 작품을, 명시 적 위치에 파티션을 추가하는 경우 : 파티션을 복구 '난 그냥이 할 수있는 스크립트를 작성할 수 있습니다

alter table logs2 add partition (y='2012', m='11', d='09', h='10') location 's3://($BUCKET)/y=2012/m=11/d=09/H=10/' 

,하지만 난 뭔가 근본적인 WRT 누락 것 같은이 느낌 '. 아래 댓글에서 조 K로 화려한 예리한 관찰에

업데이트 # 1

덕분에, 나는 그 사건 감도 문제가 여기에 관여 할 것 같아요. 내가 않는 파티션 사양 내 외부 테이블을 만들

s3://($BUCKET)/y=2012/m=11/d=09/H=10/ 

:

파일은 확실히 (I이 어떤 ISO8601 형식에 고개를 끄덕있을 것 같아요) 대문자 H와 다음 경로 스펙과 같이 구성되어 있습니다 적절한 대소 문자 :

partitioned by (y string, m string, d string, H string) 

('H'에 유의하십시오.) 나는 디렉토리를 통해 재귀하고 파티션을 적절하게 찾지 만 어떻게 든 (지금까지 모든 유익한 장소에서 'H'를 사용 함에도 불구하고) 실제로 하이브가 소문자로 저장하는 것처럼 보이는 복구 파티션을 수행한다. :

hive> show partitions logs; 
OK 
y=2012/m=11/d=06/h=08 

('h'에주의하십시오). 따라서 Hive는 파티션을 발견 할 수 있지만 소문자 형태로 저장합니다 ... 나중에 데이터를 찾을 때 S3가 대소 문자를 구분하므로 이러한 경로는 물론 비어 있습니다.

내 소용량 디렉토리 구조로 데이터를 옮기고 그 작동 여부를 확인합니다 ...

업데이트 # 2

사실, 내가합니다 (S3 파일 레이아웃) 파티션 이름으로 대문자 'H'는 문제가 여기에 있었던 것을 확인했다. 지금까지 내가 말할 수있는 건,이 일어나고있는 것입니다 : 파티션이 올바르게 이러한 파티션을 발견 RECOVER 실행

    S3에 내 레이아웃은 대소 문자를 구분하는 파티션 이름이 있었다
  • (H를 =)
  • ...
  • 하지만 내부적으로 소문자로 저장됩니다. (h)

'recover partitions'명령은 Amazon에서 제작 한 하이브의 확장 기능입니다. 이 구성 요소에 버그가 있다고 생각됩니다. 내 지식 네이티브 하이브는 파티션 검색을위한 파일 루트를 탐색하는 개념이 없습니다 ...

+0

누군가 다른 사람이이 길을 탐험하고있는 경우 다음 두 가지 유용한 블로그 게시물이 있습니다. http://pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json/ https : //sites.google.com/a/khanacademy.org/forge/technical/data_n/running-emr-elastic-mapreduce-on-the-khan-academy-data –

+0

알아 두어야 할 한 가지는 시간 파티션 열 게시물의 다른 부분에서 다른 사례가 있습니다. 이것이 문제의 일부일 수 있습니까? S3/Hive의 어느 부분이 대소 문자를 구분하지 않는지 확실하지 않습니다. 또한,'formatted logs2 partition (y = '2012', m = '11 ', d = '06', h = '08 ')'을 설명 할 때 출력은 무엇입니까? –

+0

조! 고맙습니다! 나는 네가 뭔가하고있는 것 같아. 나는 지금 분명히 대소 문자를 구분하는 문제의 증상 인 행동을보고있다. 나는 나의 질문을 더 많은 정보로 업데이트 할 것이다. –

답변

10

시간 필드의 경우 문제입니다!