【问题标题】:Hive PARTITIONED BY, list index out of range error?Hive PARTITIONED BY,列表索引超出范围错误?
【发布时间】: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。不确定这是什么。如果我删除分区,外部表将正常工作。

【问题讨论】:

    标签: hadoop hive hue


    【解决方案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/';
    
    1. 创建分区数据
    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");
    
    1. 将之前表格中的数据插入到最终表格中。

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

    希望这对您有所帮助。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        相关资源
        最近更新 更多