2013-05-23 11 views
12

私はいくつかのディレクトリにマップされたハイブ外部テーブルを持っています。 このディレクトリには複数のファイルが含まれています。ハイブクエリ内の列として入力ファイル名を取得する方法

は、私は、ユーザー「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()); 

ことによってそれを行うことができますか?

答えて

29

はい、あなたは、レコードは、例えば、INPUT__FILE__NAMEという名前の仮想列を使用して発見されたファイルを取得することができます、必要に応じて

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 

提供を使用します。

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

のような何かを生み出しますstring functionsを使用して、ホストとディレクトリをURIから削除します。

あなたはここに仮想列のドキュメントを見つけることができます:ハイブ内のすべてのテーブルが2つの仮想列を持っているhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

+0

嬉しい、ありがとうございました! – Julias

+0

ありがとうございました!非常に役に立ちます!特に、外部のハイブテーブルとして作成された膨大な数のログファイルの中から何かを検索すると、それ以上の洞察を得るために一致するファイル名を知ることができます。 – Sakthivel

+1

@jkovacsには、PrestoのINPUT__FILE__NAMEに相当するものがありますか? –

2

は、ハイブの仮想列のリンクを更新しました。彼らは

  1. INPUT__FILE__NAME
  2. BLOCK__OFFSET__INSIDE__FILE

INPUT__FILE__NAMEは、ファイルの名前を与えています。 BLOCK__OFFSET__INSIDE__FILEは現在のグローバルファイルの位置です。 ファイルの各レコードに対応するファイルの名前を検索するとします。 INPUT__FILE__NAME列を使用できます。この機能は、0.8以上のHiveバージョンから利用できます。以下に小さな例を示します。

クエリ

select INPUT__FILE__NAME, name from customer_data; 

これは私たちに、各レコードに対応するファイル名を与えます。ハイブテーブルに対応するファイル名を取得する場合は、以下のクエリが役立ちます。

select distinct(INPUT__FILE__NAME) from customer_data; 
関連する問題