11

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

我正在使用 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') 

LOCATION除非我更改为嵌套较少,即'hdfs://.../data/[foldername]/'使用某个文件夹名称,否则该表最终为空。对于LOCATION.

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

4

2 回答 2

5

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

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

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

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

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

于 2017-05-05T12:27:25.523 回答
1

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

我认为您无法要求 hive 将所有这些文件夹的输入视为 1 个表。

这个问题似乎解决了一个类似的问题: 在 hive 中创建外部表时,我可以将位置指向目录中的特定文件吗?

在同一上下文中有一个未解决的 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

于 2014-12-11T03:03:13.927 回答