你能改变Hive表的动态分区格式吗?

时间:2016-04-05 17:00:30

标签: hadoop hive hadoop-partitioning

PRELUDE

我使用带有动态分区的外部Hive表。

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

该表看起来像这样:

CREATE EXTERNAL TABLE `some_test`(
  `id` bigint, 
  `timestamp` int, 
  `some_other_values` bigint)
PARTITIONED BY ( 
  `year` int, 
  `month` int, 
  `day` int, 
  `hour` int)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  'hdfs://nameservice1/user/Sh4pe/hive-test'

现在,我通过这样的INSERT INTO ... SELECT ...查询进行插入:

INSERT INTO `dnies_click_log` 
PARTITION(year, month, day, hour) 
SELECT * FROM `other_db`.`other_table` 
WHERE year=2016 and month=4 and day=1 and hour=0 
LIMIT 1;

插入有效,我实际上是在表格中生成一个条目,当然还有HDFS文件。

我的问题

但我对HDFS中的目录存储方式不太满意:

Sh4pe:/home/Sh4pe$ hdfs dfs -ls /user/Sh4pe/hive-test/
Found 1 items
drwxr-xr-x   - hdfs dnies          0 2016-04-05 14:33 /user/Sh4pe/hive-test/some_test/year=2016

令我困扰的是year=2016部分。我想改为2016。同样,嵌套文件夹名为month=4。我希望改为04(尾随零)。我也希望嵌套的日历和小时目录也仅用数字命名。

是否可以更改动态分区在HDFS上的存储格式?

2 个答案:

答案 0 :(得分:0)

无法为动态创建的分区设置自定义目录名称。命名模式在函数org.apache.hadoop.hive.common.FileUtils.makePartName()中进行了硬编码。 https://github.com/apache/hive/blob/c08490b74a15ce57a140c7826ad4c666f8be719e/common/src/java/org/apache/hadoop/hive/common/FileUtils.java

答案 1 :(得分:0)

可能值得查看这些链接:

https://cwiki.apache.org/confluence/display/Hive/HCatalog+DynamicPartitions#HCatalogDynamicPartitions-HiveDynamicPartitions

https://issues.apache.org/jira/browse/HIVE-6109

从Hive 0.13.0开始看起来他们开始迎合自定义名称。 E.g。

set hcat.dynamic.partitioning.custom.pattern="${year}/${month}/${day}";