#sql #hive #hiveql
#sql #улей #hiveql
Вопрос:
Я пытаюсь получить данные из 3 таблиц, затем присоединиться к этому результирующему набору следующим образом:
SELECT r.region,
r.recordtype,
i.entity,
COUNT(i.requestid) AS responses
FROM (
SELECT region,
recordtype,
entity,
requestid
FROM (
SELECT region,
'a' AS recordtype,
requestid
FROM db.table1
UNION ALL
SELECT region,
'b' AS recordtype,
requestid
FROM db.table2
UNION ALL
SELECT region,
'c' AS recordtype,
requestid
FROM db.table3
) union_results
) r
RIGHT JOIN db.responses i
ON r.requestid = i.requestid
GROUP BY r.recordtype,
r.region,
i.entity
То, что я в конечном итоге ищу, является результатом строк, в которых i.requestid находится в результате объединения трех других таблиц, которые затем сгруппированы, как показано, и хотя я даже не уверен, что я правильно использую RIGHT JOIN, я получаю ошибку в основном запросе.
запрашивает таблицу 1 (a)
requestid region
abcdef us
bcdefg eu
cdefgh eu
запрашивает таблицу 2 (b)
requestid region
fghijk eu
rstuwx eu
jklmno eu
запрашивает таблицу 3 (c)
requestid region
klmnop eu
ghijkl eu
opqrst eu
ответы
requestid entity
abcdef 1
rstuwx 3
ghijkl 5
opqrst 5
Результат
region entity recordtype count(responses)
us 1 a 1
eu 3 b 1
eu 5 c 2
Я успешно использую объединение самостоятельно в качестве подзапроса, но при сопряжении с объединением я получаю следующую ошибку, поэтому ищу указания на то, что я сделал неправильно, теперь у меня слепота. Я использую промежуточную таблицу, поскольку конечный план состоит в том, чтобы создать здесь несколько динамических столбцов на основе расширенных данных (образцы представляют только некоторые из столбцов, которые я в конечном итоге извлеку, как только запрос сработает).
СБОЙ: строка ParseException 4: 6 не может распознать ввод рядом с ‘(‘ ‘ВЫБЕРИТЕ’ ‘регион’ в команде joinSource, завершающейся с ret ’64’
Спасибо!
Комментарии:
1. Почему у вас есть 3 таких похожих таблицы?
2. Если вы удалите
db.responses
(i
) из своего запроса и все ссылки на него, это сработает?3. Я бы попробовал
GROUP BY r.region, r.recordtype
, когда другая проблема будет исправлена.4. Создайте представление для части UNION ALL. ОБЪЕДИНИТЕ его и СГРУППИРУЙТЕ ПО.
5. Я провел быстрый тест с объединением, присоединенным к ответам с группировкой и без ошибок. Отредактируйте вопрос, чтобы отобразить образцы данных и желаемый результат в виде текстовых таблиц.
Ответ №1:
Этот запрос сработал для меня:
SELECT r.region, r.recordtype, entity, Count(responses.requestid) AS responses FROM
(SELECT region, "a" AS recordtype, requestid FROM Table1
UNION ALL SELECT region, "b", requestid FROM Table2
UNION ALL SELECT region, "c", requestid FROM Table3) AS r
RIGHT JOIN responses ON r.requestid=responses.requestid
GROUP BY recordtype, region, entity;
Комментарии:
1. Спасибо — используя тот же запрос, я по-прежнему получаю ту же ошибку, поэтому, похоже, она не связана с промежуточным запросом:
cannot recognize input near '(' 'SELECT' 'region' in joinSource
. Я в тупике.2. Хорошо, я должен упомянуть, что я использую Access, поэтому должно быть что-то о HiveQL. Попробуйте заключить в квадратные скобки все имена объектов:
[region]
.3. Та же проблема, извините. Я выбрал * на внешнем и тоже удалил группу by. Я читал о том, что HiveQL не поддерживает связанные подзапросы, но я не думаю, что здесь дело в этом.
4. Я не могу воспроизвести проблему, поэтому не могу предложить решение.