Гость
Map
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Заковыристая выборка контактных данных в Hadoop / 4 сообщений из 4, страница 1 из 1
28.01.2021, 15:03
    #40039654
derart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заковыристая выборка контактных данных в Hadoop
Добрый день!
Нужна помощь в выборке.
Даже с трудом представляю как ее реализовать.
Есть таблица clients (client_id, name)
Есть таблица contact (client_id, phone, phone_type (1,2,3,4,5,12), contact_flg (1,0), date_add (timestamp))
Задача:
Для всех client_id найти только одно значение телефона по следующему приоритету:
1. Телефоны, где contact_flg = 1 с самой ранней датой добавления
2. Если у клиента contact_flg = 1 нет, то телефоны у которых contact_flg = 0 и phone_type=5 с самой ранней датой добавления
3. Если у клиента нет телефонов с п. 1-2, то телефоны у которых contact_flg = 0 и phone_type=2 с самой ранней датой добавления
4. Если у клиента нет телефонов с п. 1-3, то то телефоны у которых contact_flg = 0 и phone_type= любому значению с самой ранней датой добавления.
5. Если по клиенту вообще нет телефонов – вывести null
Первый пункт можно с использование row num и сортировки сделать, это я понимаю, но как остальные четыре уместить?
Результатом должна быть единственная пара Client_id, phone
...
Рейтинг: 0 / 0
28.01.2021, 16:56
    #40039683
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заковыристая выборка контактных данных в Hadoop
derart,

А поверх Hadoop / hdfs что? Hive там, Spark/Scala или какая-нибудь экзотика типа ADLA/U-SQL и пр.?
Или может есть склонность всю логику цепью на mapreduce вручную писать?
...
Рейтинг: 0 / 0
29.01.2021, 09:41
    #40039817
derart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заковыристая выборка контактных данных в Hadoop
vikkiv,

поверх hadoop - hive

Написал так, но может есть изящнее решение?
Код: plsql
1.
2.
3.
row_number() over (partition by client_id order by case when (условие1) then 0 when (условие2) then 2 ...else 9999 end, date_add) 

where rn=1
...
Рейтинг: 0 / 0
30.01.2021, 06:35
    #40040041
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заковыристая выборка контактных данных в Hadoop
derart,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select
..,
row_number()over(partition by t.client_id
order by
contact_flg desc,

case
when contact_flg=0 and phone_type=5 then 0
when contact_flg=0 and phone_type=2 then 1
else 2
end,

date_add
) as x
from contact as t
..
where.. rn=1..
-- и добавить .. join clients ... (чтобы был полный набор клиентов с null)

можно конечно подготовить наборы отвечающие условиям (каждому отдельно) и потом join а в select уже определить из какой таблицы выводить данные..
но это уже в зависимости от размеров таблиц (у Hive проблемы с индексами), профайлинг нужен для определения оптимальности под конкретную плотность/распределение данных
...
Рейтинг: 0 / 0
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Заковыристая выборка контактных данных в Hadoop / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]