что если важные дробные данные хранить в программном типе decimal, тогда же не будет таких проблем?
select cast(1.1 as double)*cast(1.1 as double)*cast(1.1 as double) as dbl, cast(1.1 as decimal(2,1))*cast(1.1 as decimal(2,1))*cast(1.1 as decimal(2,1)) as dcml
либо по старинке без дробных частей вообще (в копейках, вместо рублей, к примеру)
Народ подскажите как нормально реализовать проверку целостности данных, если они проходят несколько стадий ETL, enrichment и т.д. Это что-то типа транзакций нужно реализовывать, чтобы откатывать на предыдущие чекпойнты или на начало с очисткой промежуточных данных?
Народ подскажите как нормально реализовать проверку целостности данных, если они проходят несколько стадий ETL, enrichment и т.д. Это что-то типа транзакций нужно реализовывать, чтобы откатывать на предыдущие чекпойнты или на начало с очисткой промежуточных данных?
Если каждый этап может проверить, корректны ли выходные данные, то это будет заметно проще, чем прикручивать транзакции, если их нет. Кроме того, даже транзакция должна как-то понимать, к какому чекпоинту вернуться
Допустим получен снепшот данных в 4.7 млн записей, прошёл первый этап валидации нормально, потом его разбивают на чанки для присоединения ещё данных и если тут всё хорошо, передать другой команде для ещё одного цикла трансформаций, где всё падает и нужно откатиться на самое начало, почистив промежуточные данные, сформированные на первых двух этапах.
Если каждый этап может проверить, корректны ли выходные данные, то это будет заметно проще, чем прикручивать транзакции, если их нет. Кроме того, даже транзакция должна как-то понимать, к какому чекпоинту вернуться
Больше подробностей!
Условий для отката может быть несколько сразу или по одному, например необходимо и достаточно наличие как минимум трёх источников данных (reference data) не старше одного дня на момент обработки текущего снепшота.
И какой сейчас dataflow? Пока что выглядит так, что можно проверить условия по if else и никакой rocket science))
В пределах одного этапа несложно, однако нужно как то хранить состояние каждого из этапов (промежуточные данные, статусы и т.д.), чтобы если следующие этапы не могут завершиться, то процесс знает с какой точки возобновить обработку и с какими промежуточными данными.
В пределах одного этапа несложно, однако нужно как то хранить состояние каждого из этапов (промежуточные данные, статусы и т.д.), чтобы если следующие этапы не могут завершиться, то процесс знает с какой точки возобновить обработку и с какими промежуточными данными.
Всем привет, знает кто как/чем посмотреть что там с такой яростью собирает GC? Судя по метрикам кол-во входных данных на каждую партицию одинаковое, но при этом разница по времени сборки мусора более чем двукратная и не могу понять почему. Сама операция - join большой таблицы (~500млн) с маленькой (~40млн)
Garbage collector яростно собирает мусор. Тебе надо понять, где он тупит, на минорных сборках или на старых/полных. Для этого можно задать в executor extra java opts вывод в отладку метрики гарбадж коллекшона. Gc verbose xx:printgcdatestampts и вот это вот всё. Только файл лога надо заранее создавать, если его нет, он не ругнется. А потом прогоняй через анализаторы и смотри. Кейсов много может быть. Маленький еден и от этого частые сборки по нему, не успевает в конкарент моде старье почистить, ошибки эвакуации g1 и всё такое прочее.
Garbage collector яростно собирает мусор. Тебе надо понять, где он тупит, на минорных сборках или на старых/полных. Для этого можно задать в executor extra java opts вывод в отладку метрики гарбадж коллекшона. Gc verbose xx:printgcdatestampts и вот это вот всё. Только файл лога надо заранее создавать, если его нет, он не ругнется. А потом прогоняй через анализаторы и смотри. Кейсов много может быть. Маленький еден и от этого частые сборки по нему, не успевает в конкарент моде старье почистить, ошибки эвакуации g1 и всё такое прочее.