복붙노트

[HADOOP] 하이브 쿼리 내에서 입력 파일 이름을 열로 가져 오는 방법

HADOOP

하이브 쿼리 내에서 입력 파일 이름을 열로 가져 오는 방법

일부 디렉토리에 매핑 된 하이브 외부 테이블이 있습니다. 이 디렉토리에는 여러 파일이 있습니다.

나는 "abc"라는 사용자가있는 파일 이름 찾기와 같은 쿼리를 실행하고 싶다.

 select file_name , usr from usrs_tables where usr = "abc"

물론 데이터에는 파일 이름이 포함되지 않습니다.

MapReduce에서는

FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
System.out.println("File name "+filename);
System.out.println("Directory and File name"+fileSplit.getPath().toString());

하이브에서 어떻게 할 수 있습니까?

해결법

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

    1.예, INPUT__FILE__NAME이라는 가상 열을 사용하여 레코드가 발견 된 파일을 검색 할 수 있습니다. 예를 들면 다음과 같습니다.

    예, INPUT__FILE__NAME이라는 가상 열을 사용하여 레코드가 발견 된 파일을 검색 할 수 있습니다. 예를 들면 다음과 같습니다.

    select INPUT__FILE__NAME, id, name from users where ...;
    

    다음과 같은 결과를 낳습니다.

    hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users1.txt    2    user2
    hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users2.txt    42    john.doe
    

    필요한 경우 제공된 문자열 함수를 사용하여 uri에서 호스트 및 디렉토리를 잘라냅니다.

    가상 열에 대한 설명서는 다음에서 볼 수 있습니다. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

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

    2.Hive의 모든 테이블에는 두 개의 가상 열이 있습니다. 그들은

    Hive의 모든 테이블에는 두 개의 가상 열이 있습니다. 그들은

    INPUT__FILE__NAME은 파일 이름을 제공합니다. BLOCK__OFFSET__INSIDE__FILE은 현재 전역 파일 위치입니다. 파일의 각 레코드에 해당하는 파일의 이름을 찾고자한다고 가정하십시오. INPUT__FILE__NAME 열을 사용할 수 있습니다. 이 기능은 Hive 버전 0.8 이상에서 사용할 수 있습니다. 작은 예제가 아래에 나와 있습니다.

    질문

    select INPUT__FILE__NAME, name from customer_data;
    

    그러면 각 레코드에 해당하는 파일 이름이 표시됩니다. 하이브 테이블에 해당하는 파일 이름을 얻으려면 아래 쿼리가 도움이 될 것입니다.

    select distinct(INPUT__FILE__NAME) from customer_data;
    
  3. ==============================

    3.Hive 0.8.0은 두 개의 가상 열에 대한 지원을 제공합니다.

    Hive 0.8.0은 두 개의 가상 열에 대한 지원을 제공합니다.

    하나는 매퍼 태스크의 입력 파일 이름 인 INPUT__FILE__NAME입니다.

    다른 하나는 현재 전역 파일 위치 인 BLOCK__OFFSET__INSIDE__FILE입니다.

    블록 압축 파일의 경우 현재 블록의 첫 번째 바이트의 파일 오프셋 인 현재 블록의 파일 오프셋입니다.

    Hive 0.8.0부터 다음 가상 컬럼이 추가되었습니다 :

    하이브의 가상 열에 대한 링크가 업데이트되었습니다. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

  4. from https://stackoverflow.com/questions/16715818/how-to-get-input-file-name-as-column-within-hive-query by cc-by-sa and MIT license