#sql #hive
#sql #улей
Вопрос:
Я агрегирую таблицу в Hive. После агрегации некоторые данные смещаются слева направо, а может быть, и в другую сторону, пока не уверен.
Пример данных ниже.
--------- ------------ ------
| Site | Date | Sent |
--------- ------------ ------
| Twitter | 2019-01-01 | pos |
| Twitter | 2019-01-01 | pos |
| Twitter | 2019-01-01 | neg |
| Twitter | 2019-01-01 | pos |
--------- ------------ ------
Код прост.
1. разделите различные параметры настройки
2. Подсчитайте и сгруппируйте по сайту и дате
SELECT site, date
, COUNT(CASE sent WHEN 'negative'THEN 1 ELSE 0 END) AS negative_
, COUNT(CASE sent WHEN 'positive' THEN 1 ELSE 0 END) AS positive_
FROM my_table
GROUP BY date, site;
Ожидаемый результат
--------- ------------ ------ ----------- -----------
| Site | Date | Sent | negative_ | positive_ |
--------- ------------ ------ ----------- -----------
| Twitter | 2019-01-01 | pos | 0 | 3 |
| Twitter | 2019-01-01 | neg | 1 | 0 |
--------- ------------ ------ ----------- -----------
Фактический результат выглядит примерно так. Некоторые строки смещаются по столбцу, и кажется, что пара других смещается в другом направлении. Это не проблема, с которой я когда-либо сталкивался. Я задал внутренний запрос о конвейере данных и указанном разделителе, если таковой имеется. Пока без уважения, но я не знаю, может ли это быть причиной.
--------- ------------ ------------ ----------- -----------
| Site | Date | Sent | negative_ | positive_ |
--------- ------------ ------------ ----------- -----------
| Twitter | NULL | 2019-01-01 | 0 | 3 |
| Twitter | 2019-01-01 | neg | 1 | 0 |
--------- ------------ ------------ ----------- -----------
У кого-нибудь есть идеи, почему? Что я мог с этим поделать?
ПОЭТОМУ хочет, чтобы я написал больше для отправки этого, я не знаю, что еще написать. Вышесказанное кажется довольно простым.
Ответ №1:
Ваш код не выдаст указанный вами результат, поскольку COUNT()
учитывает не NULL
значения. ELSE 0
Означает, что CASE
выражение всегда возвращает не NULL
значение, поэтому два подсчета должны приводить к одному и тому же значению в каждой строке. Это не то, что показывают результаты.
Код, который вы намереваетесь:
SELECT site, date,
SUM(CASE sent WHEN 'negative'THEN 1 ELSE 0 END) AS negative_
SUM(CASE sent WHEN 'positive' THEN 1 ELSE 0 END) AS positive_
FROM my_table
GROUP BY date, site;
Вероятно, это не устранит проблему выравнивания, которая может быть больше связана с используемым вами инструментом, чем с результатами запроса.
Комментарии:
1. Также я использую Alation