Загрузка данных из QVD, частичная
Описание
Иногда в разработке приходится быстро проверять некоторые гипотезы на больших объемах данных, давайте объем данных представим в виде 100 000 000 строк в 1 QVD-файле.
Как долго будет грузиться такой объём данных? В зависимости от количества полей, условий загрузки, расчётов каких либо - долго, может даже минуты.
Предлагаю несколько вариантов загрузки данных, которые можно использовать исходя из ваших текущих задач, поехали!
Вариант 1. FIRST
Самый простой способ, это использование префикса перед словом LOAD
, например:
FIRST 100
LOAD ...
Такая конструкция кода загрузит нам первые 100 строк из QVD файла, на самом деле не только из QVD, но и из любого другого источника, будь то excel, csv, базы данных и прочие.
Вариант 2. RAND()
Способ, который мне не очень нравится, тем не менее имеет место, это использование случайного числа в условиях загрузки:
LOAD
Моё_Поле1
, Моё_Поле2
FROM ...
WHERE
RAND() < 0.01
В данном случае, у нас при загрузке каждой строки из источника, будет генерироваться случайно число от 0 до 1, и будет производиться проверка его на условие, что оно меньше числа 0.01, т.е. 1%. Еще раз, RAND() генерирует число от 0 до 1, где 0 - это 0%, а 1 = 100% а в условии мы проверяем значение на 0.01, что является 1% от данного случайного числа.
Аналогичным образом можно заменить 0.01 на 0.1 и мы получим 10% данных.
Но! Вы практически никогда не сможете загрузить точный процент данных из источника, всегда у вас будет плавающее значение загружаемых данных, при попытке загрузить 10% - в итоге вы можете получить 2% данных, или 15%. Всё зависит от генератора случайных чисел и это нужно учитывать.
Вариант 3. SAMPLE
Префиксный оператор SAMPLE, работает аналогично оператору RAND() в условии, всё так же, с погрешностями, пример использования:
SAMPLE 0.01
LOAD ...
FROM ...
Вариант 4. FIRST, выдай нам 1% строк. Только QVD
Лично для меня самый правильный вариант использования части данных и чуть более сложный, чем все остальные.
Первым делом читае м наш QVD файл, а именно его метаданные, и смотрим сколько строк у нас имеется внутри файла, и лишь затем, полученный результат делим на нужный нам объем, и используем префикс FIRST, смотрим:
// Просто запишем путь к нашему файлу в переменную
SET vFileToLoad = 'lib://qvd2/allkeys (2).qvd';
// Загружаем количество строк из XML метаданных QVD файла
NOCONCATENATE
_temp_rec:
LOAD
NoOfRecords
FROM [$(vFileToLoad)]
(XmlSimple, table is QvdTableHeader);
// Записываем в переменную количество строк из файла, и сразу считаем, сколько строк нам нужно загрузить
// PEEK('NoOfRecords') - читаем значение из переменной
// умножаем на нужный процент, например 0.1 = 10%
// округляем FLOOR()
LET vRecordsCountToLoad = FLOOR(PEEK('NoOfRecords') * 0.1);
// Удаляем временную таблицу
DROP TABLE _temp_rec;
// Загружаем нужное нам количество строк из файла (примечание: грузятся только первые строки)
NOCONCATENATE
FIRST $(vRecordsCountToLoad)
LOAD ...
FROM [$(vFileToLoad)](qvd);
// очищаем переменные
SET vFileToLoad;
SET vRecordsCountToLoad;
А какие вы используете варианты?
Поделитесь со мной в telegram, и я дополню статью с публикацией на канале