Свернуть строки в улье и сохранить ненулевые значения - PullRequest
0 голосов
/ 24 января 2020

У меня есть таблица в Hive, где поля athr_name и post_date равны нулю на 90% (в Hive они представлены символом «?»). Я хотел бы запросить таблицу и GROUP BY athr_name, post_date, page_nm и visit_date, чтобы получить количество посещений и посетителей. Однако я также хотел бы объединить и заменить нулевые значения значениями, где athr_name и post_date не равны null (page_nm содержит уникальные значения, поэтому может быть только правильное athr_name или null).

В других слова, у меня есть это:

   athr_name post_date         page_nm visit_date visit visitors
1      Steve  9/1/2019 /page1/content/   20191014    45       11
2      Steve  9/1/2019 /page1/content/   20191015    62       38
3      Steve  9/1/2019 /page1/content/   20191016    28       49
4      Steve  9/1/2019 /page1/content/   20191207    54       70
5      Steve  9/1/2019 /page1/content/   20191208    39       26
6          ?         ? /page1/content/   20191014    28       24
7          ?         ? /page1/content/   20191015    17       63
8          ?         ? /page1/content/   20191016    48       40
9          ?         ? /page1/content/   20191017    47       14
10         ?         ? /page1/content/   20191018    33        1

и я хочу свернуть эти данные для этого результата:

  athr_name post_date         page_nm visit_date visit visitors
1     Steve  9/1/2019 /page1/content/   20191014    73       35
2     Steve  9/1/2019 /page1/content/   20191015    79      101
3     Steve  9/1/2019 /page1/content/   20191016    76       89
4     Steve  9/1/2019 /page1/content/   20191017    47       14
5     Steve  9/1/2019 /page1/content/   20191018    33        1
6     Steve  9/1/2019 /page1/content/   20191207    54       70
7     Steve  9/1/2019 /page1/content/   20191208    39       26

Это может быть решено с помощью функции объединения, если бы это были столбцы вместо строк , Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 24 января 2020

Сначала вам нужно заполнить нулевые значения LAST_VALUE . Ваш запрос может выглядеть так:

SELECT athr_name, 
       post_date, 
       page_nm, visit_date, 
       sum(visit), 
       sum(visitors)
from (
    select nvl(athr_name, LAST_VALUE(athr_name, TRUE)
                                              OVER (ORDER BY page_nm, athr_name NULLS LAST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) as athr_name,
           nvl(post_date, LAST_VALUE(post_date, TRUE)
                                              OVER (ORDER BY page_nm, post_date NULLS LAST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) as post_date,
           page_nm,
           visit_date,
           visit,
           visitors
    from your_table) as tmp_view
GROUP BY athr_name, post_date, page_nm, visit_date;

ОБНОВЛЕНИЕ:

Если возможно, что у вас нет соответствующего athr_name или post_date для некоторого page_nm, лучше использовать это запрос, чтобы сохранить эту информацию:

SELECT athr_name, post_date, page_nm, visit_date, sum(visit), sum(visitors)
from (
         select name_view.athr_name as athr_name,
                date_view.post_date as post_date,
                main.page_nm,
                main.visit_date,
                main.visit,
                main.visitors
         from your_table main
                  LEFT JOIN (select athr_name, page_nm, row_number() over (PARTITION BY page_nm) as rn
                             from your_table
                             where athr_name is not null) name_view
                            ON main.page_nm = name_view.page_nm AND name_view.rn = 1
                  LEFT JOIN (select post_date, page_nm, row_number() over (PARTITION BY page_nm) as rn
                             from your_table
                             where post_date is not null) date_view
                            ON main.page_nm = date_view.page_nm AND date_view.rn = 1) as tmp_view
GROUP BY athr_name, post_date, page_nm, visit_date;
0 голосов
/ 24 января 2020

Делает ли это то, что вы хотите?

select max(athr_name), max(post_date), page_nm, 
       visit_date, sum(visit), sum(visitors)
from t
group by page_nm, visit_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...