Hive中静态分区和动态分区总结 (2)

以上三个阀值超过就会触发错误,集群会杀死任务。为了解决报错,我们通常将两个参数调大。但是也需要用户对自己的Hive表的分区数量进行合理规划,避免过多的分区。

4.2 特殊分区

如果动态分区列输入的值为NULL或空字符串,则Hive将该行将放入一个特殊分区,其名称由参数hive.exec.default.partition.name控制。默认值为__HIVE_DEFAULT_PARTITION__。

用户可以使用(查看表分区)命令进行查看:

show partitions 'table名称'; # process_date=20160208 #process_date=__HIVE_DEFAULT_PARTITION__

有时候异常生产这些分区数据,需要进行清理。如果使用下面的语句:

ALTER TABLE Table_Name DROP IF EXISTS PARTITION(process_date='__HIVE_DEFAULT_PARTITION__');

这时候Hive会报错:

Error: Error while compiling statement: FAILED: SemanticException Unexpected unknown partitions for (process_date = null) (state=42000,code=40000)

这是Hive一个已知bug(编号:HIVE-11208),在Hive 2.3.0版本修复。

但是有个有修复方法(不建议在生产环境中实施):

-- update the column to be "string" ALTER TABLE test PARTITION COLUMN (p1 string); -- remove the default partition ALTER TABLE test DROP PARTITION (p1 = '__HIVE_DEFAULT_PARTITION__'); -- then revert the column back to "int" type ALTER TABLE test PARTITION COLUMN (p1 int);

链接:https://cloudera.ericlin.me/2015/07/how-to-drop-hives-default-partition-hive_default_partition-with-int-partition-column/

4.3 乱码分区字段

有时候表分区字段由于处理不当,会出现乱码分区,例如:

hp_stat_time=r_ready%3D91;r_load%3D351

原因是Hive会自动对一些UTF-8字符编码成Unicode(类似网址中中文字符和一些特殊字符的编码处理)。此处%3D解码后是'='。可以使用在线转换进行解码:https://www.matools.com/code-convert-utf8。

最后使用解码后的字段即可(注意分号转义):

alter table dpdw_traffic_base drop partition(hp_stat_time='r_ready=91\;r_load=351'); 参考文献及资料

1、动态分区,链接:https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions

2、Hive Tutorial,链接:https://cwiki.apache.org/confluence/display/Hive/Tutorial

3、Apache Hive 中文手册,链接:https://www.docs4dev.com/docs/zh/apache-hive/3.1.1/reference

更多关注公众号:

image

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwffwg.html