Сравнение данных за один день из S3-контейнеров быстрее
Рассмотрим 2 потока данных ниже
1. Front End Box ----> S3 Bucket-1
2. Front End Box ----> Kafka --> Storm ---> S3 Bucket-2
Логи из ящиков передаются в ведра S3. Требование заменить поток 1 потоком 2.
Теперь данные должны быть проверены между Bucket-1
а также Bucket-2
чтобы гарантировать, что поток 2 может быть использован.
Были опробованы следующие технологические варианты:
1. Python : boto3 Apis
2. Qubole
Оба работают на ограниченном наборе данных, qubole более масштабируем, чем скрипт Python. Но все же это занимает очень много времени, чтобы сделать это (никогда не закончил, пришлось убить после запуска в течение ночи). Мы смотрим на полмиллиарда записей здесь.
запрос
SELECT
count(*)
FROM
TableA LEFT OUTER JOIN TableB
ON TableA.id = TableB.id
WHERE
TableB.id IS NULL
AND TableA.id IS NOT NULL
Вопрос
Любое предложение для инструментов, способы достичь этого быстрее?
Есть ли способы избежать объединения?
1 ответ
Решение
Наконец-то удалось избежать объединения. Следующее решение работает отлично
select sum_cat, count(*)
FROM
(
select id, sum(category) as sum_cat
from
(
select distinct id, 1 as category
from Table-1
UNION ALL
select distinct id, 1 as category
from Table-2
UNION ALL
select distinct id, 2 as category
from Table-3
UNION ALL
select distinct id, 2 as category
from Table-4
)all_ids
group by log_id
)a
group by sum_cat;
объяснение
- Сравнение данных это должно быть сделано с данными из
Table-1
а такжеTable-2
с этим вTable-3
а такжеTable-4
- Таким образом, мы назначаем
category
идентифицировать из этого набора таблиц - Все идентификаторы из набора А будут иметь
category = 1
и установить B записи имеютcategory = 2
- Теперь мы суммируем значения категорий и группируем по идентификаторам. Поэтому, когда идентификатор присутствует в обоих наборах, он будет иметь значение 3. Идентификаторы, присутствующие только в наборе А, будут иметь значение 1, то есть отсутствующие записи.