2017-01-25 1 views
1

다음 명령과 avro 스키마를 따라 하이브 테이블을 만들었습니다..avro 파일에서 하이브 테이블로 데이터 가져 오기

이제 HDFS에있는 데이터를 생성 된 테이블로 덤프하고 싶습니다.

HDFS 위치가 있습니다. 디렉토리 구조가 t/y/m/d/h/hh/data.avro 인 데이터가 있습니다. 내 파티션 열이기 때문에 분할 영역에 따라 여러 개의 디렉토리가 있습니다.

모든 데이터를 만든 테이블에 덤프하고 싶습니다.

외부 테이블을 사용해 보았지만 예외가 발생했습니다.

답변

2

hdfs 폴더에서 하이브 규칙을 따르고 테이블 위치를 가리키는 하이브 테이블을 만드는 경우 msck 복구 테이블 문을 실행해야합니다.

/location/data/y=2016/m=02/d=03/h=03/hh=12/data.avro 등

CREATE TABLE table_name 
PARTITIONED BY (t string, y string, m string, d string, h string, hh string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema/schema.avsc') 
location "hdfs:///location/data; 

들어

및로드 데이터 /location/data/y = 2016/m = 02/d = 03/h = 03/hh = 13/data2.그 방법으로 브로

당신 같은 추가 파티션을 사용하여이 작업을 수행하지 않으려면 하이브는 파티션

msck repair table table_name; 

을 인식하기 때문에 다음과 같은 문으로 데이터를로드 할 수 있습니다

ALTER TABLE table_nameADD PARTITION (y='01',m='02',d='03',h='03',hh='12') location '/yourpath/y=2016/m=02/d=03/h=03/hh=12/'; (or any other folder) 
1

외부 테이블 생성을위한 쿼리 또는 LOAD DATA LOCAL INPATH 'path_hdfs' OVERWRITE INTO TABLE table_name; 물리적 테이블을 사용하는 쿼리에서 LOCATION 'path_hdfs' 명령을 삽입 할 수 있습니다.

는 UPDATE :

OP에 의해 질문으로

, 나는 파티션에 대한 자세한 정보를 추가 할 수 있습니다. 쿼리를 생성하는 동안 PARTITIONED BY (day string) 명령을 지정해야합니다 (데이터 유형 'string'의 'day'변수의 예제). 전체 예제는 lake에서 제공 한 답변을 참조하십시오. 그런 다음, 창조에 대한 데이터가 이미 '일'에 대한 값을 다음과 같은 경우 :

  • 일 = 2017년 11월 2일
  • 일 = 2017년 11월 3일
  • 일을 = 2017년 11월 4일

MSCK REPAIR TABLE <table> 명령을 실행하면이 세 값의 파티션이 추가됩니다. 당신이 MSCK REPAIR TABLE <table> 새로운 값을 새로운 파티션을 추가됩니다 실행하면 다음 날, 가정 당신은, 일 = 2017년 11월 5일에 대한 데이터를 수신 :

  • 일 = 2017년 11월 5일

물리적으로 파티션을 추가하면 HDFS의 여러 폴더에 데이터가 정리됩니다. 파티션을 만들려면 데이터에 대한 쓰기 권한이 필요합니다. 그러나 이미 파티션이있는 경우 폴더 시스템에 "day = 2017-11-02"형식의 이름이 지정된 각 폴더가 있는지 확인하십시오. 이런 식으로 MSCK REPAIR 명령을 실행하면 파티션이 자동으로 메타 데이터로로드됩니다. 나는 항상 외부 테이블과 함께 작업했으며,이 파이프 라인을 완벽하게 사용했습니다.

+0

디스크에 쓰기 권한이 없기 때문에 create external table에서 'path_hdfs'LOCATION을 사용할 수 없습니다. – KrunalParmar

+0

내가 LOAD DATA 명령을 사용할 때 예외가 발생했습니다. ,,, FAIRED : SemanticException [오류 10062] : 대상 테이블이 분할되어 있기 때문에 파티션 열을 지정해야합니다 ... 어떻게 파티션을 지정할 수 있습니까? – KrunalParmar

+0

만들기 쿼리 중에 파티션을 선언 한 다음 MSCK REPAIR

명령을 주기적으로 실행하여 새 데이터를 가져온 후 (파티션 측면에 새 값 사용) 파티션을 업데이트해야합니다. 예를 들어, 매일 파티션을 나누는 경우 매일 MSCK REPAIR 명령을 실행하여 새 요일을 파티션에 추가해야합니다. 이제 파티션 구문으로 내 대답을 업데이트합니다. –

0

다음 구문이 유용합니다.

CREATE EXTERNAL TABLE table_name 
    PARTITIONED BY (part string) 
    ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
    WITH SERDEPROPERTIES (
    'avro.schema.url'='hdfs:///path/to/avro/schema/') 
    STORED AS INPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
    OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
    LOCATION 'path/to/location' 

    ALTER TABLE table_name ADD PARTITION (part='part_name') LOCATION 'location' 
관련 문제