2014-01-09 91 views
1

我想創建一個外部HIVE表,該表利用HDFS中已有的數據。這些文件位於/hdfs/data/locationyear-month格式的子目錄中。例如:/hdfs/data/location/2013-december/hdfs/data/location/2014-january從不同記錄格式的文件創建外部HIVE表

這些目錄內有多個文件,但文件內是不同類型的數據(不同的字段)。不同類型的記錄的實例是:

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'; 

回答

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; 
+0

我還需要where type ='A',因爲type ='B'沒有這些列嗎? –

+0

您可以添加其他類型的其他列(即pmap ['zipcode'],pmap ['population']),如果該值不在地圖中,它應該返回null。 或者您可以添加「pmap ['type'] ='A'」 –

相關問題