2015-10-26 2 views
1

Я бегу Apache Hadoop 2.6.0 на Ubuntu 14.0 и У меня есть таблица, созданная в улье 0.13.0 как:HiveQL запрос не возвращает результатов и никаких ошибок

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 

или даже при определенных условиях в ИНЕКЕ я получаю результаты, как ожидается, но работает более сложные запросы, которые я получаю приседать. Например:

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 или мои запросы написаны неправильно.

Любая помощь была бы принята с благодарностью. С уважением.

+0

Как насчет разрыва запроса на небольшие временные таблицы? Или есть требование получить результат в одном запросе? – Tammy

+0

Не требование, но я хотел бы сделать это в одном запросе, потому что я делаю сравнение времени выполнения запроса на трех разных системах, и я хотел бы, чтобы он был унифицирован. – user3745794

ответ

1

Если у нас есть таблица Cuisine, содержащая ID = {1,2,3} и таблицу рецептов, содержащую ID = {5,6,7}, то даже если эти таблицы не пусты, мы по-прежнему не получаем строк, возвращаемых, когда мы делаем INNER JOIN Cuisine.ID = Recipe.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 

Таким образом, внутренний запрос возвращает строку, когда все счетчики (*) отличны от нуля. Теперь проверьте внешний выбор:

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"; 
1

Вы уверены, что соединение будет не пустым. Поскольку вы внедрили внутренние соединения, даже если в одной таблице отсутствуют записи, весь набор результатов равен 0. Попробуйте добавить левое соединение с помощью «IS NULL», чтобы проверить, что все таблицы способствуют набору результатов. Если все дочерние таблицы имеют ненулевые значения в своих соответствующих столбцах после объединения, то запрос хорош.

+0

Я не совсем понимаю ваш ответ. Вы предполагаете, что одна из таблиц может быть пустой и, таким образом, вернуть 0 строк? – user3745794

+1

Я проверил свои данные, и у всех строк есть что-то добавленное к ним, вероятно, «\ t», и, вероятно, поэтому я возвращаю 0 строк. Как только я выясню, как его удалить. он должен работать. Спасибо за вашу помощь и извините за мое отсутствие. Несмотря на то, что мой запрос не возвращает результатов, и это простой запрос, который отлично работает, для выполнения требуется много времени. Например, один и тот же запрос в MySQL выполняется менее чем за секунду, но в Hive требуется почти минута. Это распространено? – user3745794

+2

Улей предназначен для большой обработки данных. Если ваши таблицы меньше, реляционные СУБД, такие как MySQL, будут бить улей вовремя. Но, по мере роста данных, вы увидите, как Hive работает лучше. Это также связано с настройкой двух систем. Если у вас есть система улей одного узла, тогда как MySQL - это производственная оценка, вы можете увидеть разницу в производительности. Пожалуйста, разместите конфигурацию сервера для Hive и Mysql, мы можем обсудить больше об этом. – Tammy

Смежные вопросы