Hive从文件名创建表分区

时间:2015-12-02 18:28:05

标签: hadoop hive apache-pig hiveql hadoop2

Hadoop新手。我知道如何在Hive中创建一个表(语法) 使用3分区键创建表。但密钥位于文件名中。

FileName示例:ServerName_ApplicationName_ApplicationName.XXXX.log.YYYY-MM-DD

目录中有数百个文件想要创建一个包含以下分区键的表来自文件名:ServerName,ApplicationName,Date并将所有文件加载到表中 Hive脚本将是首选,但对任何其他想法开放

(文件是CSV。我知道文件的架构(列定义))

1 个答案:

答案 0 :(得分:3)

我假设文件名的格式为ServerName_ApplicationName.XXXX.log.YYYY-MM-DD(删除第二个“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...';

使用以下查询从基表插入分区表:

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;

我测试了这个并且它有效。