Смещение столбцов данных после агрегации [Hive]

#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