hive按s3文件名中的动态值进行分区

wfsdck30  于 2021-05-27  发布在  Hadoop
关注(0)|答案(0)|浏览(244)

假设具有所需数据的s3位置的形式为: s3://stack-overflow-example/v1/ 其中每个文件标题 v1/ 是那种形式的

francesco_{YYY_DD_MM_HH}_totti.csv

每个csv文件的每一行都包含一个unix时间戳作为一列。
是否可以在每个文件名中创建一个由{yyy\u dd\u mm\u hh}分区的外部配置单元表,而不首先创建一个未分区的表?
我试过以下方法:

create external table so_test 
(
a int,
b int,
unixtimestamp string
)
PARTITIONED BY (
 from_unixtime(CAST(ord/1000 as BIGINT), 'yyyy-MM-dd') string
)
LOCATION 's3://stack-overflow-example/v1'

但这失败了。
一个可行的方法是创建一个未分区的表,如下所示:

create external table so_test 
(
a int,
b int,
unixtimestamp string
);
LOCATION 's3://stack-overflow-example/v1'

然后动态插入到分区表中:

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

create external table so_test_partitioned 
(
a int,
b int,
unixtimestamp string
)
PARTITIONED BY (
 datep string
)
LOCATION 's3://stack-overflow-example/v1';

INSERT OVERWRITE TABLE so_test_partitioned PARTITION (date)
select 
a,
b,
unixtimestamp,
from_unixtime(CAST(ord/1000 as BIGINT), 'yyyy-MM-dd') as datep,
from so_test;

首先创建一个未分区的表是唯一的方法吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题