HiveQL 查询不返回任何结果,也没有错误

Posted

技术标签:

【中文标题】HiveQL 查询不返回任何结果,也没有错误【英文标题】:HiveQL query returns no results and no errors 【发布时间】: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

Simple Hive query is empty

但未能解决我的问题。数据实际上位于 HDFS 中,如前所述,它适用于简单查询。

所以要么我的 Hive 实例有问题,要么我的查询写得不正确。

任何帮助将不胜感激。 最好的问候。

【问题讨论】:

如何将查询分解为更小的临时表?或者是否需要在单个查询中获取结果? 不是必需的,但我想在一个查询中完成,因为我正在比较三个不同系统上的查询执行时间,我希望它是统一的。 【参考方案1】:

如果我们有包含 ID = 1,2,3 的 Cuisine 表和包含 ID = 5,6,7 的 Recipe 表,那么即使这些表不是空的,我们仍然没有返回任何行做 INNER JOIN Cuisine.ID = Recipe.ID (因为 ID 在 2 个表中不同) 你能检查一下没有这样的情况吗?

SELECT count(1)
FROM cuisine c JOIN recipe ON recipe.cuisine = c.name WHERE c.name = "Pakistan";

--- must return > 0 

select count(1) from recipe as recipe
JOIN part_of ON part_of.id_recipe = recipe.id ;

--- must return > 0 

select count(1) from part_of as part_of
JOIN ingredient ON ingredient.name = part_of.ingredient ;

--- must return > 0 

因此,当所有 count(*) 非零时,内部查询返回一行。现在测试外部选择:

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 = <inner query result> and cuisine.name = "Bangladesh";

【讨论】:

【参考方案2】:

您确定生成的联接不是空的吗?因为,您已经实现了内连接,即使一个表缺少记录,整个结果集也是 0。尝试添加一个带有“IS NULL”的左连接,以验证所有表都对结果集有贡献。如果所有子表在连接后各自的列中都有非空值,则查询是好的。

【讨论】:

我不完全理解你的回答。您是否建议其中一张表可能为空并因此返回 0 行? 我检查了我的数据,所有字符串都添加了一些东西,可能是 '\t',这可能就是我得到 0 行作为回报的原因。一旦我弄清楚如何删除它。它应该工作。感谢您的帮助,请原谅我的缺席。尽管我的查询没有返回任何结果,而且它是一个运行良好的简单查询,但它需要很长时间才能执行。例如,在 mysql 中执行相同的查询不到一秒,但在 Hive 中几乎需要一分钟。这很常见吗? Hive 适用于大数据处理。如果你的表更小,像 MySQL 这样的关系 DBMS 将及时击败 Hive。但是,随着数据的增长,您会看到 Hive 表现更好。它还与 2 个系统的设置方式有关。如果您有单节点 Hive 系统,而 MySQL 是生产级,您可以看到性能差异。请发布您的 Hive 和 Mysql 的服务器配置,我们可以对此进行更多讨论。 数据较小时使用like操作。那么就不需要删除'\t'了。它可能是列分隔符。但是,如果数据较小并且您现在只需要查看结果,请使用 like 运算符。您可以在部署到生产之前纠正文件创建过程或 ddl 结构。 select * from table1 as A left outer join table2 as B on A.id like B.id ||'%';不过需要测试查询。

以上是关于HiveQL 查询不返回任何结果,也没有错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Firestore 有时不返回任何内容,没有错误,啥也没有?

LINQ to XML 查询不返回任何结果

即使查询返回结果,Twitter-typeahead 也不显示任何结果

为啥这个 PHP MongoDB 查询即使有结果也不返回任何结果?

sqlsrv_query 不返回行,长查询没有错误

如何将 HiveQL 查询的结果输出到 CSV?