Hive:SemanticException [错误10002]:第3:21行无效的列引用'name'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive:SemanticException [错误10002]:第3:21行无效的列引用'name'相关的知识,希望对你有一定的参考价值。

我使用以下hive查询脚本的版本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'

有什么想法在这里发生了什么?

感谢您的帮助

谢谢!

答案

如果按列分组,则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

你希望输出与群组一起出现什么?你想通过小组做什么来完成什么?

另一答案

好的,让我看看我能否以更好的方式提出这个问题。

这是我的两张桌子

电影列表 - 包含电影信息

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;

谢谢你的解释。我可能会为下一个帖子保存以下问题,但这是我的观察:

执行分组和联接时,整体作业的性能会降低,而不是在两个单独的查询中执行。对于同样的工作,我已经稍微更改了代码以首先执行分组,然后加入数据并且整个过程减少了40秒。早些时候需要140秒,现在需要100秒。有什么理由吗?

再次感谢您的解释。

另一答案

我遇到了同样的问题:

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

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

以上是关于Hive:SemanticException [错误10002]:第3:21行无效的列引用'name'的主要内容,如果未能解决你的问题,请参考以下文章

Hive报错FAILED: SemanticException Can not find 表名 in genColumnStatsTask

SemanticException [错误 10014] Hive UDF

Hive:FAILED: SemanticException [Error 10001]: Line 1:14 Table not found 'Field'

Hive 给出 SemanticException [错误 10014]:运行我的 UDF 时

更新后-Hive免费版本2.1 报错问题收集

Hive - 向表中添加新列时,我得到:SemanticException [Error 10002]: Invalid column reference