2014-06-26 17 views
10

Aşağıdaki gibi dosya yollarında Avro biçiminde Avro biçiminde veri var: /data/logs/[foldername]/[filename].avro. Tüm bu günlük dosyaları, yani /data/logs/*/* formunun tüm dosyaları üzerinde bir Hive tablosu oluşturmak istiyorum. (Hepsi aynı Avro şemasına dayalı ediyoruz.)Yuvalanmış alt dizinlerden girdileri içeren kovanı oluştur tablo

Ben bayrağı mapred.input.dir.recursive=true aşağıda sorguyu çalıştırıyorum: Daha az iç içe olmak LOCATION değiştirmediğiniz sürece

CREATE EXTERNAL TABLE default.testtable 
    ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
    STORED AS INPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
    OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
    LOCATION 'hdfs://.../data/*/*' 
    TBLPROPERTIES (
    'avro.schema.url'='hdfs://.../schema.avsc') 

tablo boş olmak biter, yani belirli bir kullanıcı adıyla 'hdfs://.../data/[foldername]/' olmalıdır. Bu, LOCATION için daha az iç içe geçmiş bir yolla sorun yaratmadı.

Tüm bu farklı [foldername] klasörlerden veri kaynağı oluşturabilmek istiyorum. Yinelemeli giriş seçimini yuvalanmış dizinlerimde daha ileriye nasıl yaparım?

cevap

0

Sorununuzu çözecek bir şey, klasör adını harici tabloya bir bölüm sütunu olarak eklemektir. Ardından, yalnızca veri dizini üzerinde oluştururken tablo oluşturabilirsiniz. Veya bu iç içe geçmiş dosyaları alabilir ve bunları tek bir dizinde düzleştirebilirsiniz.

Aksi halde, 1 tablo olarak kabul edilen tüm bu klasörlerin girişini kovandan isteyebileceğinizi düşünmüyorum.

Bu sorular benzer bir sorunu ele görünüyor: when creating an external table in hive can I point the location to specific files in a direcotry?

açık jira sorunu aynı bağlamda üzerinde bulunmaktadır: https://issues.apache.org/jira/browse/HIVE-951

Tarama fazla sana alternatif olarak SimlinkInputTextFormat kullanmak düşündüren bu yazı gördüm . Bunun Avro formatı ile ne kadar iyi uçacağından emin değilim. Bu Kovan ayarları https://hive.apache.org/javadocs/r0.10.0/api/org/apache/hadoop/hive/ql/io/SymlinkTextInputFormat.html

1

kullanın özyinelemeli dizinleri etkinleştirmek için:

set hive.mapred.supports.subdirectories=TRUE; 
set mapred.input.dir.recursive=TRUE; 

dış tablosu oluşturun ve bir konum olarak kök dizini belirtin:

LOCATION 'hdfs://.../data' 

Sen tablo yerden verilerini sorgulamak mümkün olacak ve tüm alt dizinler

+0

'hive.input.dir.recursive'? 'hive.supports.subdirectories'? Diğer (yanlış) cevaplardan kopyalamışsınız gibi görünüyor. Bazı araştırmalar yapıp –

+0

@Dudu Markovitz test etmeyi öneriyorum. Bunu Hive 1.2.1'de test ettim. Bu harika çalışıyor. Hive alt dizinleri destekler. Belki bu ayarların hepsi gerekli değil, ama bu benim için çalışıyor. – leftjoin

+0

Bu cevabı kendiliğinden kılan gereksiz parametreler değildir, mevcut olmayan parametrelerdir. Ayrıca, varolan olmayan parametrelerin kullanılması, hive 0.14'ten beri, hive.conf.validation' true değerine ayarlandığında istisnalar atar, bu da varsayılan değerdir. https://issues.apache.org/jira/browse/HIVE-7211 –

İlgili konular