Hive PARTITIONED BY,列表索引超出范围错误?

Posted

技术标签:

【中文标题】Hive PARTITIONED BY,列表索引超出范围错误?【英文标题】:Hive PARTITIONED BY, list index out of range error? 【发布时间】:2015-08-20 16:00:23 【问题描述】:

我在 Cloudera 上运行 Hive 和 Hue。 我将以下文本文件上传到 hdfs。我正在尝试在按 id 分区的配置单元中创建一个外部表。无论出于何种原因,它都无法正常工作。

/user/test2/test.csv

id,name,age
1,sam,10
2,john,5
1,rick,4

蜂巢:

CREATE EXTERNAL TABLE IF NOT EXISTS testDB (
    name STRING,
    age  INT
)
COMMENT 'This is the test database'
PARTITIONED BY (id INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/test2/'
TBLPROPERTIES ("skip.header.line.count" = "1");

在 Hue 上,hive 编辑器,当我尝试查看示例数据时,它显示list index out of range。不确定这是什么。如果我删除分区,外部表将正常工作。

【问题讨论】:

【参考方案1】:

您位于“/user/test2/test.csv”的数据由三列构成,但为表“testDB”定义的架构包含两列,出现此错误是正常的。 您必须通过添加 id 列来更新您的脚本:

CREATE EXTERNAL TABLE IF NOT EXISTS testDB (
    id INT,
    name STRING,
    age  INT
)
...

【讨论】:

感谢您的回复。这不是我收到错误的原因。如果我在模式中包含 id,我将无法按 id 对其进行分区。 表的创建脚本必须为您的数据定义所有列。添加 id 列不会影响 id 列上的分区。 CREATE EXTERNAL TABLE IF NOT EXISTS testDB ( id INT, name STRING, age INT ) COMMENT 'This is the test database' PARTITIONED BY (id INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/test2/' TBLPROPERTIES ("skip.header.line.count" = "1"); 如果你这样做,hive 会给你一个错误Column repeated in partitioning columns。还是我不理解你?! 在执行“PARTITIONED BY”时,您必须以不同的方式命名 id。 尝试如下操作: CREATE EXTERNAL TABLE IF NOT EXISTS testDB ( id INT, name STRING, age INT ) COMMENT 'This is the test database' PARTITIONED BY (key INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/test2/' TBLPROPERTIES ("skip.header.line.count" = "1");【参考方案2】:

您没有对数据进行分区,因为您还没有创建它。您应该遵循 3 个步骤:

1- 挂载指向 .csv 文件的数据。

 CREATE EXTERNAL TABLE TableName (id int, name string, age int) 
 ROW FORMAT DELIMITED    FIELDS TERMINATED BY ','  LINES TERMINATED BY '\n'
 STORED AS TEXTFILE LOCATION '/user/test2/';
    创建分区数据
CREATE EXTERNAL TABLE IF NOT EXISTS testDB (
name STRING,
age  INT )   
COMMENT 'This is the test database'
PARTITIONED BY (id INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION '/user/other/location'   
TBLPROPERTIES ("skip.header.line.count" = "1");

    将之前表格中的数据插入到最终表格中。

    插入表 testDB 分区(存档)选择名称,年龄来自 表名;

希望这对您有所帮助。

【讨论】:

【参考方案3】:

所以我终于解决了我的问题。以下是我的解决方案。

我使用的是Cloudera vm - 5.4.2,当我启动Hue时,Hue中的Hive设置指向HiveServer2;但我使用 Hive CLI 创建了表。所以基本上该表只存在于HiveServer1中。

解决方案: 与其使用 Hive CLI,不如在直线中创建表,然后 Hue 中的所有内容都应该可以工作。

【讨论】:

以上是关于Hive PARTITIONED BY,列表索引超出范围错误?的主要内容,如果未能解决你的问题,请参考以下文章

hive创建表的时候没有partitioned by能否在创表之后添加分区

带有 USING 和 PARTITIONED BY 子句的 spark hive 创建表的有效语法是啥?

hive:按“max(partitioned_col)”过滤而不执行全表扫描

Partitioned by 给我创建外部表时重复的错误列

hive建表时partitioned分区字段类型只能用string吗?可以用其他的字段类型吗?

如何在“PARTITIONED BY”子句的括号之间以逗号分隔的tick中提取值