【发布时间】:2015-10-26 10:03:11
【问题描述】:
我在 Ubuntu 14.0 上运行 Apache Hadoop 2.6.0,我在 Hive 0.13.0 中创建了一个表:
CREATE TABLE IF NOT EXISTS recipes_hive.cuisine (
ID INT COMMENT 'Cuisine ID.',
name STRING COMMENT 'Cusine name - primary key.',
area STRING COMMENT 'Name of the area of origin - foreign key.',
scope STRING COMMENT 'Either country or area.')
COMMENT 'Table containing cuisines data.'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
我用数据填充它:
LOAD DATA LOCAL INPATH 'path_to_file/CUISINE.csv'
OVERWRITE INTO TABLE recipes_hive.cuisine;
我的数据库有几个这样的表,它们都是用相同的过程创建和填充的。运行简单查询时,例如:
SELECT * FROM cuisine
或者甚至在 WHERE 子句中的某些条件下,我得到了预期的结果,但运行更复杂的查询我得到了蹲下。例如:
SELECT cuisine.name, SUM(IF (ingredient.category = "fruit",1,2))/count(*) AS PERC
FROM cuisine JOIN recipe ON recipe.cuisine = cuisine.name JOIN part_of ON part_of.id_recipe = recipe.id JOIN ingredient ON ingredient.name = part_of.ingredient
GROUP BY cuisine.name
ORDER BY PERC DESC
,或者:
SELECT ingredient.id, ingredient.name
FROM cuisine JOIN recipe ON recipe.cuisine = cuisine.name JOIN part_of ON part_of.id_recipe = recipe.id JOIN ingredient ON ingredient.name = part_of.ingredient
WHERE ingredient.id IN (
SELECT ingredient.id
FROM cuisine c JOIN recipe ON recipe.cuisine = c.name JOIN part_of ON part_of.id_recipe = recipe.id JOIN ingredient ON ingredient.name = part_of.ingredient
WHERE c.name = "Pakistan") AND cuisine.name = "Bangladesh"
第一个示例计算某个百分比,第二个示例检查相互元素。
MapReduce 和 Hadoop 被正确调用并且它们没有返回错误。输出结束于:
Execution completed successfully
MapredLocal task succeeded
OK
Time taken: 122.119 seconds
我已经检查了网络,人们也遇到了与我类似的问题。我检查了:
Hive Table returning empty result set on all queries
但未能解决我的问题。数据实际上位于 HDFS 中,如前所述,它适用于简单查询。
所以要么我的 Hive 实例有问题,要么我的查询写得不正确。
任何帮助将不胜感激。 最好的问候。
【问题讨论】:
-
如何将查询分解为更小的临时表?或者是否需要在单个查询中获取结果?
-
不是必需的,但我想在一个查询中完成,因为我正在比较三个不同系统上的查询执行时间,我希望它是统一的。