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)”过滤而不执行全表扫描