2013-05-23 22 views
12

Bazı dizine eşlenen bir dış tablo var. Bu dizinde birkaç dosya bulunmaktadır.Kovan sorgusu içindeki girdi dosyası adını sütun olarak nasıl girilir

Bir kullanıcı "abc"

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

Ama tabii veri içindeki dosya adını içerir gelmez orada bulmak dosya adı gibi sorgu çalıştırmak istiyorum. MapReduce yılında

ben Hive bunu nasıl yapabilirim

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()); 

bunu yapabilir?

cevap

29

Evet, örneğin rekor INPUT__FILE__NAME adlandırılmış sanal sütunu kullanarak tespit edildi dosyayı alabilirsiniz:

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

verir gibi bir şey:

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 

gerekirse verilen kullanma Ana makine ve dizinleri uri'den kesmek için string functions.

Burada sanal sütunlar üzerinde belgeleri bulabilirsiniz: Sanal sütunlarda https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

+0

Harika, Çok teşekkürler! – Julias

+0

Çok teşekkürler! Bu çok yararlı! Özellikle, harici kovan tablosu olarak oluşturulmuş çok sayıda günlük dosyasından bir şey ararsak, daha fazla bilgi edinmek için eşleşen dosya adlarını öğreniriz. – Sakthivel

+1

@jkovacs, Presto'da INPUT__FILE__NAME eşdeğeri var mı? –

3

Her tablo iki sanal sütun vardır. Onlar

  • BLOCK__OFFSET__INSIDE__FILE
  • INPUT__FILE__NAME dosyasının adını verir

    1. INPUT__FILE__NAME
    2. bulunmaktadır. BLOCK__OFFSET__INSIDE__FILE güncel küresel dosya konumundadır. Bir dosyadaki her kaydın karşılığı olan dosyanın ismini bulmak istersek, varsayalım. INPUT__FILE__NAME sütununu kullanabiliriz. Bu özellik, 0.8'in üzerindeki Hive sürümlerinden edinilebilir. Aşağıda küçük bir örnek verilmiştir.

      Sorgu

      select INPUT__FILE__NAME, name from customer_data; 
      

      Bu bize her kayıt tekabül dosya adını verecektir. Bir kovan tablosuna karşılık gelen dosya isimlerini almak istiyorsanız, aşağıdaki sorgu size yardımcı olacaktır.

      select distinct(INPUT__FILE__NAME) from customer_data; 
      
    İlgili konular