hive从文件名创建表分区

pb3s4cty  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(341)

hadoop新手。我知道如何在配置单元中创建表(语法)创建一个具有3个分区键的表。但是钥匙是用文件名写的。
文件名示例:servername\u applicationname\u applicationname.x.log.yyyy-mm-dd
一个目录中有数百个文件需要创建一个表,其中包含以下来自文件名的分区键:servername、applicationname、date并将所有文件加载到表中hive脚本将是首选项,但对任何其他想法都是开放的
(文件为csv。我知道文件的模式(列定义)

ig9co6j1

ig9co6j11#

我假设文件名的格式为servername\u applicationname.x.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;

我已经测试过了,它能用。

相关问题