복붙노트

[HADOOP] 데이터를 복사하지 않고 Hive 테이블로 데이터를 가져올 수 있습니까?

HADOOP

데이터를 복사하지 않고 Hive 테이블로 데이터를 가져올 수 있습니까?

HDFS에 텍스트로 저장된 로그 파일이 있습니다. 로그 파일을 하이브 테이블에로드하면 모든 파일이 복사됩니다.

모든 텍스트 데이터가 두 번 저장되는 것을 피할 수 있습니까?

편집 : 나는 다음 명령을 통해로드

LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221')

그런 다음 정확히 동일한 파일을 찾을 수 있습니다.

/user/hive/warehouse/sandbox.db/test/day=20130220

나는 그것이 복사되었다고 추정했다.

해결법

  1. ==============================

    1.외부 테이블을 사용하십시오.

    외부 테이블을 사용하십시오.

    CREATE EXTERNAL TABLE sandbox.test(id BIGINT, name STRING) ROW FORMAT
                  DELIMITED FIELDS TERMINATED BY ','
                  LINES TERMINATED BY '\n' 
                  STORED AS TEXTFILE
                  LOCATION '/user/logs/';
    

    외부 테이블로 파티션을 사용하려면 파티션 디렉토리를 관리해야합니다. 지정된 위치는 hdfs 디렉토리 여야합니다.

    외부 테이블 하이브를 삭제하면 원본 데이터가 삭제되지 않습니다. 원시 파일을 관리하려면 외부 테이블을 사용하십시오. 하이브가 그것을하기를 원한다면, let 하이브는웨어 하우스 경로 안에 저장합니다.

  2. ==============================

    2.대신 java 응용 프로그램에서 직접 데이터를 HDFS로 복사하는 대신 해당 파일을 로컬 파일 시스템에 저장하고 다음 명령을 사용하여 하이브를 통해 HDFS로 가져올 수 있습니다.

    대신 java 응용 프로그램에서 직접 데이터를 HDFS로 복사하는 대신 해당 파일을 로컬 파일 시스템에 저장하고 다음 명령을 사용하여 하이브를 통해 HDFS로 가져올 수 있습니다.

    LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221')
    

    LOCAL을 주목하라.

  3. ==============================

    3.alter table partition 문을 사용하여 데이터 중복을 피할 수 있습니다.

    alter table partition 문을 사용하여 데이터 중복을 피할 수 있습니다.

    create External table if not exists TestTable (testcol string) PARTITIONED BY (year INT,month INT,day INT) row format delimited fields terminated by ',';
    
    ALTER table TestTable partition (year='2014',month='2',day='17') location 'hdfs://localhost:8020/data/2014/2/17/';
    
  4. ==============================

    4.하이브 (진정한 클러스터 모드에서 실행될 때 최소한)는 로컬 파일 시스템의 외부 파일을 참조 할 수 없습니다. Hive는 테이블 생성 또는로드 작업 중에 파일을 자동으로 가져올 수 있습니다. 그 이유는 Hive가 MapReduce 작업을 내부적으로 실행하여 데이터를 추출하기 때문일 수 있습니다. MapReduce는 HDFS에서 읽고 HDFS에 다시 쓰며 심지어 분산 모드에서도 실행됩니다. 따라서 파일을 로컬 파일 시스템에 저장하면 분산 인프라 스트럭처에서 사용할 수 없습니다.

    하이브 (진정한 클러스터 모드에서 실행될 때 최소한)는 로컬 파일 시스템의 외부 파일을 참조 할 수 없습니다. Hive는 테이블 생성 또는로드 작업 중에 파일을 자동으로 가져올 수 있습니다. 그 이유는 Hive가 MapReduce 작업을 내부적으로 실행하여 데이터를 추출하기 때문일 수 있습니다. MapReduce는 HDFS에서 읽고 HDFS에 다시 쓰며 심지어 분산 모드에서도 실행됩니다. 따라서 파일을 로컬 파일 시스템에 저장하면 분산 인프라 스트럭처에서 사용할 수 없습니다.

  5. from https://stackoverflow.com/questions/15271061/is-it-possible-to-import-data-into-hive-table-without-copying-the-data by cc-by-sa and MIT license