你能改变配置单元表的动态分区的格式吗?

jbose2ul  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(443)

序曲
我使用的是带有动态分区的外部配置单元表。

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

这张table看起来像这样:

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;

insert起作用了,我实际上在表中生成了一个条目,当然还有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 (尾随零)而不是。我还希望嵌套的day和hour目录也只能用数字命名。
是否可以更改动态分区存储在hdfs上的格式?

h7wcgrx3

h7wcgrx31#

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

jq6vz3qz

jq6vz3qz2#

可能值得一看这些链接:
https://cwiki.apache.org/confluence/display/hive/hcatalog+dynamicpartitions#hcatalogdynamicpartitions-HiveDynamic分区

https://issues.apache.org/jira/browse/hive-6109
看起来他们从Hive0.13.0开始就开始迎合定制名字了。例如

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

相关问题