2012-10-30 2 views
8

로그 파일이 HDFS에 있으며 값은 쉼표로 구분됩니다. 예를 들어 :파티션 테이블에서 하이브로드

2012-10-11 12:00,opened_browser,userid111,deviceid222

는 지금은 열이 "타임 스탬프", "행동"을 가지고 "의 DeviceID를" "용자 ID"에 의해 분할 된 테이블을 하이브이 파일을로드 할. Hive에게 테이블의 파티션으로 로그 파일의 마지막 두 컬럼을 가져 오도록 요청할 수 있습니까? 모든 예제 e.g. "hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');"은 스크립트에서 파티션의 정의가 필요하지만 파티션을 HDFS 파일에서 자동으로 설정하고자합니다.

한 가지 해결 방법은 4 개의 열이 모두있는 중간 분할되지 않은 테이블을 만든 다음 파일에서 채우고 INSERT into first_table PARTITION (userid,deviceid) select from intermediate_table timestamp,action,userid,deviceid;을 작성하는 것입니다.하지만 추가 작업은 2 개의 매우 유사한 테이블을 만들 것입니다. 중간 테이블로 외부 테이블.

답변

12

Ning Zhang은 주제에 대한 답변이 http://grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tables입니다. 당신이 첫번째 중간 테이블로 데이터를로드 할 것을 제안

  • 파티션을 알아낼 수 없도록

    1. 로드 데이터는 단순히 데이터를 복사, 그것을 읽지 않습니다 :

      빠른 컨텍스트이다 (또는 모든 파일을 가리키는 외부 테이블을 사용하여) 파티션 된 테이블에로드하기 위해 동적 인서트를 끼워 넣을 수 있습니다.

  • +0

    감사합니다, 데니. 그것이 내가이 문제를 해결 한 방법입니다. 원시 파일을 가리키는 외부 테이블을 사용하고 그 파일의 데이터가 선택된 파티션으로 분할 된 테이블에 삽입됩니다. 이것은 이러한 경우의 유일한 해결책입니다. –

    +0

    멋진 것들 - 다행, 다행?! –

    +0

    예, 그것은 마법입니다 :) 나는 당신이 당신의 코멘트를 추가 할 때 동시에 그것을 풀었습니다. 어쩌면 당신은 다른 이슈로 저를 도울 수 있습니까? http://stackoverflow.com/questions/13240409/hadoop-eof-exception-after-map-step –

    1

    이 시나리오는 매우 효과적이지만 대신에 각 파티션에 대한 HDFS 데이터 파일 로드해야합니다.

    데이터가 MapReduce 작업에서 나왔기 때문에 Reducer 클래스에서 MultipleOutputs을 사용하여 해당 파티션 파일에 데이터를 멀티플렉싱했습니다. 그런 다음 HDFS 파일 이름의 파티션을 사용하여 스크립트를 작성하는 것입니다. @Denny 님의 답변에서 언급 한 바와 같이

    0
    1. , 우리는 준비 테이블 (invites_stg) 또는 외부 관리 을 포함하고 (이 경우 초대) 분할 된 테이블에 준비 테이블에서 삽입해야합니다.

    2. 우리가 설정이 두 가지 속성이 있는지 확인하십시오 : SET의 hive.exec.dynamoc.partition을 = 마지막으로

    3. 그리고 초대에 삽입 진정한 SET의 hive.exec.dynamic.partition.mode = 엄격

      , INSERT OVERWRITE TABLE 인도 분할 (주) SELECT COL 'S FROM invites_stg;

    도움이 링크를 참조하십시오 http://www.edupristine.com/blog/hive-partitions-example