Hive使用嵌套子目录的输入创建表

时间:2014-06-26 18:59:46

标签: hadoop hive avro

我在HDFS中以Avro格式存储文件路径中的数据,例如:/data/logs/[foldername]/[filename].avro。我想在所有这些日志文件上创建一个Hive表,即/data/logs/*/*形式的所有文件。 (它们都基于相同的Avro架构。)

我正在使用标记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]/'某个foldername,否则该表最终为空。对于LOCATION的嵌套路径较少,这没有问题。

我希望能够从所有这些不同的[foldername]文件夹中获取数据。 如何使嵌套目录中的递归输入选择更进一步?

2 个答案:

答案 0 :(得分:2)

使用此Hive设置启用递归目录:

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

创建外部表并将根目录指定为位置:

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

您将能够从表位置和所有子目录查询数据

答案 1 :(得分:1)

解决您问题的一件事是将文件夹名称作为分区列添加到外部表。然后,您可以在数据目录上创建表格时创建表格。 或者您可以将这些嵌套文件放在一个目录中。

我不认为您可以让配置单元输入所有这些被视为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