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

uklbhaso  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(481)

我在hdfs文件路径中有avro格式的数据,如: /data/logs/[foldername]/[filename].avro . 我想在所有这些日志文件(即窗体的所有文件)上创建一个配置单元表 /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')

如果我不换table,table就空了 LOCATION 少嵌套,即 'hdfs://.../data/[foldername]/' 有一个特定的文件夹名。这对于嵌套较少的路径没有问题 LOCATION .
我希望能够从所有这些不同的[foldername]文件夹中获取数据。如何在嵌套目录中进一步进行递归输入选择?

wljmcqd8

wljmcqd81#

解决问题的方法之一是将文件夹名作为分区列添加到外部表中。然后就可以在数据目录上创建表。或者你可以把这些嵌套的文件放在一个目录中。
我不认为你能要求hive将所有这些文件夹的输入视为一个表,否则。
这个问题似乎解决了一个类似的问题:在hive中创建外部表时,我能否将位置指向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

yrwegjxp

yrwegjxp2#

使用此配置单元设置启用递归目录:

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

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

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

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

相关问题