2014-06-26 65 views
10

我在HDFS中的文件路徑中具有Avro格式的數據,例如:/data/logs/[foldername]/[filename].avro。我想在所有這些日誌文件上創建一個Hive表,即所有格式爲/data/logs/*/*的文件。 (他們都基於相同的Avro的模式。)Hive使用來自嵌套子目錄的輸入創建表格

我運行下面的查詢與標誌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') 

表結束是空的,除非我改變LOCATION要少嵌套,即將'hdfs://.../data/[foldername]/'與某個文件夾名稱。這對LOCATION的嵌套路徑不起任何作用。

我希望能夠從所有這些不同的[文件夾名稱]文件夾中獲取數據。 如何使我的嵌套目錄中的遞歸輸入選擇更進一步?

回答

0

解決您的問題的一件事是將文件夾名稱作爲分區列添加到外部表中。然後,您可以在數據目錄中創建表格。 或者你可以把這些嵌套文件放在一個目錄中。

我不認爲你可以要求配置單元輸入所有這些文件夾,否則視爲1表。

這個問題似乎解決了類似的問題: when creating an external table in hive can I point the location to specific files in a direcotry?

有一個開放JIRA問題在同樣的情況下: https://issues.apache.org/jira/browse/HIVE-951

瀏覽更多的我看到這個帖子建議你使用SimlinkInputTextFormat作爲替代。我不確定你的Avro格式會如何。 https://hive.apache.org/javadocs/r0.10.0/api/org/apache/hadoop/hive/ql/io/SymlinkTextInputFormat.html

1

使用該蜂巢設置來啓用遞歸目錄:

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

創建外部表,並指定根目錄的位置:

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

您可以查詢到表中的位置數據和所有子目錄

+0

'hive.input.dir.recursive'? 'hive.supports.subdirectories'?似乎你已經從其他(錯誤)答案中複製了它。我建議你做一些研究和測試 –

+0

@Dudu Markovitz。我已經在Hive 1.2.1上測試過了。這很好。 Hive支持子目錄。也許不是所有這些設置都是必要的,但是這對我有用。 – leftjoin

+0

它不僅僅是不必要的參數,這使得這個答案本身不好,它是不存在的參數。此外,當hive.conf.validation設置爲true時,使用不存在的參數會拋出異常,因爲Hive 0.14是默認值。 https://issues.apache.org/jira/browse/HIVE-7211 –