gpt4 book ai didi

hadoop - Hive 根据文件名创建表分区

转载 作者:可可西里 更新时间:2023-11-01 16:25:32 24 4
gpt4 key购买 nike

Hadoop 新手。我知道如何在 Hive 中创建表(语法)创建具有 3 个分区键的表。但 key 在文件名中。

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

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

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

最佳答案

我假设文件名的格式为 ServerName_ApplicationName.XXXX.log.YYYY-MM-DD(删除了第二个“应用程序名称”,假设它是一个拼写错误)。

根据原始文件的内容创建一个表。一些东西,比如..

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;

我已经测试过了,它有效。

关于hadoop - Hive 根据文件名创建表分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34050294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com