[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.예, 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.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.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
from https://stackoverflow.com/questions/16715818/how-to-get-input-file-name-as-column-within-hive-query by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 인수를 Hadoop 매퍼로 전달 (0) | 2019.07.06 |
---|---|
[HADOOP] 현재 실행중인 hadoop 작업의 이름을 얻는 방법? (0) | 2019.07.06 |
[HADOOP] MapReduce의 파티셔닝은 정확히 어떻게 작동합니까? (0) | 2019.07.06 |
[HADOOP] HDFS 디렉토리의 파일 수 (0) | 2019.07.06 |
[HADOOP] hadoop에서 어떤 데이터 블록이 어떤 데이터 노드에 있는지 추적하는 방법은 무엇입니까? (0) | 2019.07.06 |