从具有不同记录格式的文件创建外部HIVE表

时间:2014-01-09 16:51:14

标签: hive external hdfs

我想创建一个利用HDFS中已有数据的外部HIVE表。这些文件位于/hdfs/data/location之类的目录和year-month格式的子目录中。例如:/hdfs/data/location/2013-december/hdfs/data/location/2014-january

在这些目录中有多个文件,但文件中是不同类型的数据(不同的字段)。不同类型记录的示例如下:

输入A

type
state
city
population

B型

type
zipcode
registeredvoters

实际数据示例(制表符分隔)

type:A   state:New York  city:New York    population:8336697
type:A   state:California  city:Los Angeles population:3857799
type:B   zipcode:92118  registeredvoters:794051
type:B   zipcode:92155  registeredvoters:794053
type:A   state:Illinois    city:Chicago population:2714856

数据已经采用这种格式,并且被HIVE以外的其他进程使用,因此更改它可能不是一种选择。我也不想在HDFS中复制数据。

有没有办法只为上面数据中定义的给定类型创建一个HIVE表?

这是我到目前为止创作的内容:

create external table population (
  type string,
  state string,
  city string,
  population int
)
location '/hdfs/data/location';

1 个答案:

答案 0 :(得分:3)

我认为你不能拥有一个表,但我认为你可以创建一个视图,使用str_to_map UDF解释该行

create external table raw_population( line string ) location '/hdfs/data/location';

create view population_view as
select
    pmap['type'] as type,
    pmap['state'] as state,
    pmap['city'] as city
    pmap['population'] as population
from 
  ( select str_to_map( line, '\t', ':') as pmap from raw_population ) pm;