以上三个阀值超过就会触发错误,集群会杀死任务。为了解决报错,我们通常将两个参数调大。但是也需要用户对自己的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
更多关注公众号: