2015-12-02 145 views
0

Hadoop的新手。我知道如何在Hive(语法)中创建表格 使用3分区键创建表格。但键在文件名中。Hive从文件名创建表分区

文件名示例:ServerName_ApplicationName_ApplicationName.XXXX.log.YYYY-MM-DD

有数百个文件的目录中要创建从文件名称下面的分区键的表:服务器,应用程序名称,日期和负载在表 所有文件蜂巢脚本将是偏好,但开放给任何其他的想法

(文件是CSV,和我所知道的架构文件(列定义))

回答

3

我假定文件名格式为ServerName_ApplicationName.XXXX.log.YYYY-MM-DD(r emoved第二个“applicationname”假设它是一个错字)。

在原始文件的内容上创建一个表。有些东西一样..

create external table default.stack 
(col1 string, 
col2 string, 
col3 string, 
col4 int, 
col5 int 
) 
ROW FORMAT DELIMITED 
FIELDS terminated by ',' 
STORED AS INPUTFORMAT             
    'org.apache.hadoop.mapred.TextInputFormat'       
OUTPUTFORMAT               
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
location 'hdfs://nameservice1/location1...'; 

在另一个位置再创建一个分区表像

create external table default.stack_part 
(col1 string, 
col2 string, 
col3 string, 
col4 int, 
col5 int 
) 
PARTITIONED BY (servername string, applicationname string, load_date string) 
STORED as AVRO -- u can choose any format for the final file 
location 'hdfs://nameservice1/location2...'; 

使用下面的查询INSERT INTO分区表从基表:

set hive.exec.dynamic.partition.mode=nonstrict; 
SET hive.exec.compress.output=true; 
set hive.exec.parallel=true; 
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; 

Insert overwrite table default.stack_part 
partition (servername, applicationname, load_date) 
select *, 
     split(reverse(split(reverse(INPUT__FILE__NAME),"/")[0]),"_")[0] as servername 
     ,split(split(reverse(split(reverse(INPUT__FILE__NAME),"/")[0]),"_")[1],'[.]')[0] as applicationname 
     ,split(split(reverse(split(reverse(INPUT__FILE__NAME),"/")[0]),"_")[1],'[.]')[3] as load_date 
from default.stack; 

我已经测试过这一点,有用。