Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中

Posted

技术标签:

【中文标题】Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中【英文标题】:Hive: Unable to insert data in table with 100 or more partition columns Error: in column "PART_NAME" that has maximum length of 767 【发布时间】:2017-06-23 06:35:15 【问题描述】:

我正在使用 hive,我需要创建一个包含“n”个普通列和 100 个或更多作为分区列的表,并且我能够成功创建该表。 现在,当我使用具有相同架构的另一个表的数据加载该表并且所有列都是非分区列时,我收到如下错误:

失败并出现异常 MetaException(message:Attempt to store value 失败并出现异常 MetaException(消息:尝试存储值“c1=v1/c2=v2/c3=v3/....c100=v100” 在最大长度为 767 的“PART_NAME”列中。请更正 你的数据!)

考虑到最后一行错误,我尝试减少列名及其值,以便生成的分区路径变得更短并且有效!但它不应该像实时场景中的列名大小,它们的值可以是分区路径等任何东西。

例如这是我的创建表查询:

创建表 xyz( c0 int) PARTITIONED BY (c1 String,c2 String,c3 String,c4 String.......c100 String) 行格式分隔字段以“|”终止存储为文本文件

这是我对查询的插入:

INSERT INTO TABLE xyz PARTITION (gc1,c2,c3....,c100) SELECT c0,c1,c2,c3,c4...., c100 FROM table123;

我是不是做错了什么,还是我必须设置一些属性才能使用如此多的分区,比如 100 个或更多? 请给我任何线索,我被困在这上面。 谢谢

【问题讨论】:

嗨 vaijnath,我也面临这个问题,感谢任何有用的信息。 这是对数据建模的滥用。您实际上是将每条记录存储在不同的分区/文件夹中 @Dudu-markovitz 我以这个查询为例,在这种情况下,100 个分区列并不奇怪。 是的。这完全是滥用。 (1) 10K+ partitions(!),而不是列。 (2) 慷慨是当你阻止某人因为缺乏基本理解而犯下可怕的错误时,而不是当你允许他做他想做的任何事情并让他自己处理后果时. (3) 给定一组列,其中每列只有 2 个可能的值,你知道 10 / 20 / 30 列的潜在组合数是多少吗? 【参考方案1】:

我同意专家的意见,我们不应该在一个表中使用这么多分区。

另外我想引用这一点,因为大多数节点都是基于 unix/linux 的,我们无法创建长度大于 255 字节的文件夹或文件名。这可能是您收到此错误的原因,因为分区只是一个文件夹。

Linux 的最大文件名长度为 255 个字符 文件系统(包括 EXT4),最大路径为 4096 个字符。 eCryptfs 是一个分层文件系统。

【讨论】:

以上是关于Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中的主要内容,如果未能解决你的问题,请参考以下文章

Hive 分区表 - 尝试将数据从一个表加载到我的 Hive 中的分区表并得到 [错误 10044]*

在具有标识列的表中插入 select from

将记录插入到具有180列的表中

如何创建分区具有不同列的 AWS Glue 表? ('HIVE_PARTITION_SCHEMA_MISMATCH')

count(*) 来自 2 个具有相同列的表

蜂巢。动态分区并插入特定列