2014-06-26 12 views
10

Mam dane w formacie Avro w HDFS w ścieżkach plików takich jak: /data/logs/[foldername]/[filename].avro. Chcę utworzyć tabelę Hive nad wszystkimi tymi plikami dziennika, tj. Wszystkie pliki w postaci /data/logs/*/*. (Są one oparte na tym samym schemacie Avro.)Hive utwórz tabelę z wejściami z zagnieżdżonych podkatalogów

biegnę poniższego zapytania z flagą mapred.input.dir.recursive=true:

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') 

Tabela kończy się pusty, chyba że zmieni LOCATION być mniej zagnieżdżone, tj. Być 'hdfs://.../data/[foldername]/' z pewną nazwą foldername. To działało bez problemu z mniej zagnieżdżoną ścieżką dla LOCATION.

Chciałbym móc pobierać dane ze wszystkich różnych folderów [foldername]. W jaki sposób uczynić rekursywny wybór wejścia pójść dalej w moich zagnieżdżonych katalogów?

Odpowiedz

0

Jedną z rzeczy, która rozwiązałaby twój problem jest dodanie nazwy folderu jako kolumny partycji do tabeli zewnętrznej. Następnie możesz utworzyć tabelę, którą właśnie tworzysz, w katalogu danych. Lub możesz wziąć te zagnieżdżone pliki i spłaszczyć je w jednym katalogu.

Nie sądzę, że będziesz w stanie poprosić ul, aby dane wejściowe wszystkich tych folderów zostały uznane za 1 tabelę.

to pytanie wydaje się być zajęcie podobnego problemu: when creating an external table in hive can I point the location to specific files in a direcotry?

Jest kwestią otwartą JIRA na tym samym kontekście: https://issues.apache.org/jira/browse/HIVE-951

przeglądanie bardziej widziałem ten post sugerujące użyć SimlinkInputTextFormat jako alternatywa . Nie jestem pewien, jak dobrze by to latało z twoim formatem Avro. https://hive.apache.org/javadocs/r0.10.0/api/org/apache/hadoop/hive/ql/io/SymlinkTextInputFormat.html

1

Zastosowanie Ta gałąź ustawienia, aby umożliwić rekurencyjnych katalogi:

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

Tworzenie tabeli zewnętrznej i określić katalog główny jako lokalizacji:

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

będzie w stanie do kwerendy danych z umieszczeniem tabeli i wszystkie podkatalogi

+0

'hive.input.dir.recursive'? 'hive.supports.subdirectories'? Wygląda na to, że skopiowałeś go z innych (błędnych) odpowiedzi. Sugeruję wykonanie pewnych badań i testów –

+0

@Dudu Markovitz. Przetestowałem to na Hive 1.2.1. Działa to świetnie. Hive obsługuje podkatalogi. Może nie wszystkie z tych ustawień są potrzebne, ale to działa dla mnie. – leftjoin

+0

To nie tylko niepotrzebne parametry, które powodują, że ta odpowiedź jest zła, to nieistniejące parametry. ponadto użycie nieistniejących parametrów generuje wyjątki od Hive 0.14, gdy "hive.conf.validation" jest ustawione na true, co jest domyślne. https://issues.apache.org/jira/browse/HIVE-7211 –