【问题标题】:Hive: SemanticException [Error 10002]: Line 3:21 Invalid column reference 'name'Hive:SemanticException [错误 10002]:第 3:21 行无效的列引用“名称”
【发布时间】:2014-05-02 13:45:55
【问题描述】:

我正在为 0.13.0 版本使用以下配置单元查询脚本

DROP TABLE IF EXISTS movies.movierating;
DROP TABLE IF EXISTS movies.list;
DROP TABLE IF EXISTS movies.rating;
DROP DATABASE IF EXISTS movies;

ADD JAR /usr/local/hadoop/hive/hive/lib/RegexLoader.jar;

CREATE DATABASE IF NOT EXISTS movies;

CREATE EXTERNAL TABLE IF NOT EXISTS movies.list (id STRING, name STRING, genre STRING)
ROW FORMAT SERDE 'com.cisco.hadoop.loaders.RegexSerDe'with SERDEPROPERTIES(
 "input.regex"="^(.*)\\:\\:(.*)\\:\\:(.*)$",
 "output.format.string"="%1$s %2$s %3$s");

 CREATE EXTERNAL TABLE IF NOT EXISTS movies.rating (id STRING, userid STRING, rating STRING, timestamp STRING)
 ROW FORMAT SERDE 'com.cisco.hadoop.loaders.RegexSerDe'
 with SERDEPROPERTIES(
 "input.regex"="^(.*)\\:\\:(.*)\\:\\:(.*)\\:\\:(.*)$",
 "output.format.string"="%1$s %2$s %3$s %4$s");

 LOAD DATA LOCAL INPATH 'ml-10M100K/movies.dat' into TABLE movies.list;
 LOAD DATA LOCAL INPATH 'ml-10M100K/ratings.dat' into TABLE movies.rating;

 CREATE TABLE movies.movierating(id STRING, name STRING, genre STRING, rating STRING);

 INSERT OVERWRITE TABLE movies.movierating
 SELECT list.id, list.name, list.genre, rating.rating from movies.list list LEFT JOIN movies.rating rating ON (list.id=rating.id) GROUP BY list.id;

问题是当我执行没有“GROUP BY”子句的脚本时,它可以正常工作。 但是当我使用“GROUP BY”子句执行它时,我收到以下错误

FAILED: SemanticException [Error 10002]: Line 4:21 Invalid column reference 'name'

你知道这里发生了什么吗?

感谢您的帮助

谢谢!

【问题讨论】:

    标签: hadoop mapreduce hive hiveql


    【解决方案1】:

    如果您按列分组,则您的 select 语句只能选择 a) 该列,b) 仅从该列派生的列,或 c) 应用于其他列的 UDAF。

    在这种情况下,您只是按 list.id 分组,因此当您尝试选择 list.name 时,这是无效的。这样想:如果您的列表包含以下两个条目会怎样:

    id|name |genre
    --+-----+------
    01|name1|comedy
    01|name2|horror
    

    您希望此查询返回什么:

    select list.id, list.name, list.genre from list group by list.id;
    

    在这种情况下,这是荒谬的。我猜实际上 id 是一个主键,但是注意 hive 不知道这一点,所以上面的数据集是完全有效的。

    考虑到所有这些,我不清楚如何修复它,因为我不知道所需的输出。例如,假设没有 group by(只是连接),你有输出:

    id|name |genre |rating
    --+-----+------+-------
    01|name1|comedy|'pretty good'
    01|name1|comedy|'bad'
    02|name2|horror|'9/10'
    03|name3|action|NULL
    

    您希望分组依据的输出是什么?你想通过分组来完成什么?

    【讨论】:

      【解决方案2】:

      好的,让我看看我是否可以用更好的方式问这个问题。

      这是我的两张桌子

      电影列表表 - 包含电影信息

      ID | Movie Name | Genre
      1  | Movie 1    | comedy
      2  | movie 2    | action
      3  | movie 3    | thriller
      

      我有评分表

      MOVIE_ID | USER ID | RATING on 5 | TIMESTAMP
      1        |  xyz    | 5           | 12345612
      1        |  abc    | 4           | 23232312
      2        |  zvc    | 1           | 12321123
      2        |  zyx    | 2           | 12312312
      

      我想做的是通过以下方式获取输出:

      Movie ID | Movie Name | Genre    | Rating Average
      1        | Movie 1    | comedy   | 4.5 
      2        | Movie 2    | action   | 1.5
      

      我不是数据库专家,但我理解这一点,当您将数据组合在一起时,您需要将多个值转换为标量值或所有值,如果字符串应该相同,对吗?

      例如,在我之前的案例中,我将它们组合成一个字符串。所以对于 list.id、list.name 和 list.genre 是可以的,但是 list.rating 在这里总是会出现一些问题(我刚和 hive 一起学习了 PIG,所以在那里分组的工作方式不同)

      因此,为了解决这个问题,我将评级计算出来并取平均值,然后将其存储在浮动表中。看看我下面的代码:

      CREATE TABLE movies.movierating(id STRING, name STRING, genre STRING, rating FLOAT);
      
      INSERT OVERWRITE TABLE movies.movierating
      SELECT list.id, list.name, list.genre, AVG(cast(rating.rating as FLOAT)) from movies.list list LEFT JOIN movies.rating rating ON (list.id=rating.id) GROUP BY list.id, list.name,list.genre order by list.id DESC;
      

      感谢您的解释。我可能会将以下问题保存到下一个线程,但这是我的观察:

      与在两个单独的查询中执行相比,同时执行 Grouping 和 Joining 会降低整体作业的性能。对于同一项工作,我稍微更改了代码以先执行分组,然后加入数据,总时间减少了 40 秒。之前需要 140 秒,现在需要 100 秒。有什么理由吗?

      再次感谢您的解释。

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题:

        org.apache.hadoop.hive.ql.parse.SemanticException: Invalid column reference "charge_province"
        

        在我将“charge_province”放入group by 后,问题就消失了。我不知道为什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-16
          • 2021-08-26
          • 2014-04-05
          • 2020-06-30
          • 2015-02-11
          • 2016-12-30
          • 2015-07-01
          • 1970-01-01
          相关资源
          最近更新 更多