2014-11-05 13 views
5

Mam kilka dzienników serwera WWW, które chciałbym wysłać do Hive. Struktura katalogów, w HDFS, wygląda następująco:Czy Hive może rekurencyjnie zejść do podkatalogów bez partycji lub edytować plik hive-site.xml?

/data/access/web1/2014/09 
/data/access/web1/2014/09/access-20140901.log 
[... etc ...] 
/data/access/web1/2014/10 
/data/access/web1/2014/10/access-20141001.log 
[... etc ...] 
/data/access/web2/2014/09 
/data/access/web2/2014/09/access-20140901.log 
[... etc ...] 
/data/access/web2/2014/10 
/data/access/web2/2014/10/access-20141001.log 
[... etc ...] 

jestem w stanie utworzyć tabelę zewnętrzne:

CREATE EXTERNAL TABLE access(
    host STRING, 
    identity STRING, 
    user STRING, 
    time STRING, 
    request STRING, 
    status STRING, 
    size STRING, 
    referer STRING, 
    agent STRING) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
    "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?", 
    "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s") 
LOCATION '/data/access/' 

... choć Hive nie zejść do podfolderów chyba biegnę następujące polecenia przed uruchomieniem kwerendy Hive:

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

widziałem innych stanowisk ustawić te właściwości na poziomie tabeli (np Issue creating Hive External table using tblproperties):

TBLPROPERTIES ("hive.input.dir.recursive" = "TRUE", 
    "hive.mapred.supports.subdirectories" = "TRUE", 
    "hive.supports.subdirectories" = "TRUE", 
    "mapred.input.dir.recursive" = "TRUE"); 

Niestety, nie zadziałało to dla mnie: tabela nie zwraca żadnych rekordów, gdy go odpytuję. Rozumiem, że możliwe jest ustawienie tych właściwości w pliku hive-site.xml, ale wolę nie wprowadzać żadnych zmian, które mogłyby wpłynąć na innych użytkowników, jeśli nie będę tego potrzebować.

Q) Czy istnieje sposób utworzenia tabeli, która zstępuje do podkatalogów bez używania partycji, wprowadzania zmian w całym serwisie lub uruchamiania tych 4 poleceń za każdym razem?

+1

można umieścić te polecenia 4 w .hiverc CLI przy wywołaniu bez opcji -i będzie próbował załadować HIVE_HOME/bin/.hiverc i $ HOME /. hiverc jako pliki inicjujące. – user3484461

Odpowiedz

9

Przy użyciu Hive w HDInsight, ustawiam następujące właściwości, zanim utworzę moją zewnętrzną tabelę w kwerendzie Hive i działa ona dla mnie.

SET hive.mapred.supports.subdirectories=TRUE; 
SET mapred.input.dir.recursive=TRUE; 
1

Nie są to właściwości tabel.

TBLPROPERTIES ("hive.input.dir.recursive" = "TRUE", 
    "hive.mapred.supports.subdirectories" = "TRUE", 
    "hive.supports.subdirectories" = "TRUE", 
    "mapred.input.dir.recursive" = "TRUE"); 

A) dodać

<property> 
    <name>mapred.input.dir.recursive</name> 
    <value>true</value> 
    </property> 

    <property> 
    <name>hive.mapred.supports.subdirectories</name> 
    <value>true</value> 
    </property> 

w ula-site.xml

0

Jeśli używasz ambari zestawie następujące właściwości do ula zaawansowaną config wewnątrz niestandardowego ula-site.xml.

** - zestaw hive.input.dir.recursive = TRUE

zestaw hive.mapred.supports.subdirectories = TRUE

SET hive.supports.subdirectories = TRUE

SET mapred. input.dir.recursive = TRUE **

Następnie ponownie uruchom zainfekowane usługi. Spowoduje to rekursywne odczytanie wszystkich danych.

0

ustawień z postu ozw1z5rd pracował na Hortonworks

alter table .... set blproperties (
    "hive.input.dir.recursive" = "TRUE", 
    "hive.mapred.supports.subdirectories" = "TRUE", 
    "hive.supports.subdirectories" = "TRUE", 
    "mapred.input.dir.recursive" = "TRUE");